অ্যান্টিটিসেট আপডেট করতে অক্ষম - কারণ এটির একটি DefiningQuery রয়েছে এবং <UpdateFunction> উপাদান নেই exist


533

আমি। নেট 3.5 এর সাথে সত্ত্বা ফ্রেমওয়ার্ক 1 ব্যবহার করছি।

আমি এর মতো সহজ কিছু করছি:

var roomDetails = context.Rooms.ToList();

foreach (var room in roomDetails)
{        
   room.LastUpdated = DateTime.Now;
}

আমি চেষ্টা করার সময় এই ত্রুটিটি পাচ্ছি:

 context.SaveChanges();

আমি ত্রুটি পেয়েছি:

অ্যান্টিটিসেট আপডেট করতে অক্ষম - কারণ এটির একটি DefiningQuery রয়েছে এবং বর্তমান অপারেশনটিকে সমর্থন করার জন্য <মডেফিকেশন ফাংশন ম্যাপিং> উপাদানটিতে কোনও <UpdateFunction> উপাদান বিদ্যমান নেই।

আমি প্রসঙ্গে প্রচুর আপডেট করছি এবং কোনও সমস্যা নেই, আমি কেবল তখনই এই নির্দিষ্ট সত্তাকে আপডেট করার চেষ্টা করি।

আমার সমস্ত অনুসন্ধান একই জিনিসটি দেখায়, যে সত্তার আপডেট করার চেষ্টা করছি সেই সত্তায় কোনও প্রাথমিক কী ঘোষিত হয়নি। তবে হায়, আমার কাছে একটি প্রাথমিক কী ঘোষিত আছে ...


61
আমি একটি ভুল করেছি, টেবিলে একটি প্রাথমিক কী সেট ছিল না, আপনার সময়ের জন্য ধন্যবাদ! অসুবিধার জন্য দুঃখিত!
আইকোড

1
আমার সাথে সবেমাত্র ঘটেছিল - সম্ভবত প্রাথমিক কীগুলি সহ 1000 টি টেবিল তৈরি করেছিল এবং একটিটি ভুলে গিয়েছিল - ব্যতিক্রম বার্তাটি তেমন কোনও
উপকারে

1
চমৎকার। সত্যিই আমি টেবিলে প্রাথমিক কী যুক্ত করতে ভুলে গেছি। আসুন সাবধান হওয়ার চেষ্টা করুন)
এইএমএলভিজি

উত্তর:


1022

নিম্নলিখিত কারণগুলির মধ্যে একটি কারণে এটি সাধারণত ঘটে থাকে:

  • সত্তা সেট ডেটাবেস ভিউ থেকে ম্যাপ করা হয়
  • একটি কাস্টম ডেটাবেস কোয়েরি
  • ডাটাবেস টেবিলের একটি প্রাথমিক কী নেই

এটি করার পরে, ত্রুটি হওয়া বন্ধ করার আগে আপনাকে অ্যান্টিটি ফ্রেমওয়ার্ক ডিজাইনারের (অথবা বিকল্পভাবে সত্তাটি মুছুন এবং তারপরে এটি যুক্ত করুন) আপডেট করতে হবে।


2
এছাড়াও স্টোর পরিবর্তন করার বিষয়টি নিশ্চিত করুন: Entটিটিসেটের জন্য কেবল স্কিমাতে স্কিমা, যদি আপনার এখনও সমস্যা হয়।
জিওফ

53
তারপরে সত্তাটি মুছুন এবং পুনরায় তৈরি করুন কারণ EF ডিজাইনারের আপডেটটি ঠিক কাজ করে না।
সানক্যাট 2000

48
উত্তর ছিল পিকে। ধন্যবাদ!
nrod

1
EF ডিজাইনারের আপডেটটি ডাটাবেসে প্রাথমিক কী যুক্ত করার পরে আমার পক্ষে ভাল কাজ করেছিল। EF 5.0 এবং
.NET

1
একই অবস্থা ! থেক্স ... এটিকে গ্রহণের জন্য টেবিলটি সরিয়ে পুনরায় ইএফ-তে যুক্ত করতে হয়েছিল
আজ্পেফার

90

সারণীতে একটি প্রাথমিক কী যুক্ত করুন। এটাই. সমস্যা সমাধান.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

13
এবং আপনার .edmx ফাইলে "ডেটাবেস থেকে আপডেট মডেল" ক্লিক করতে ভুলবেন না
বাশার আবু শামা

@ বাশারআবুশামা এই বিবরণ ছাড়া উত্তরটি বৈধ নয়।
কেহলান ক্রুমমে

66

এটা আমার ক্ষেত্রে। কেবল অপসারণের ফলে অন্য একটি ত্রুটি হয়েছিল। আমি এই পোস্টের পদক্ষেপগুলি সর্বশেষ পোস্ট ব্যতীত অনুসরণ করেছি। আপনার সুবিধার জন্য, আমি পোস্টটি থেকে 4 টি পদক্ষেপগুলি অনুলিপি করেছিলাম যা নীচের মত সমস্যা সমাধানের জন্য অনুসরণ করেছি:

  1. এডিএমএক্স ফাইলটিতে ডান ক্লিক করুন, এক্সএমএল সম্পাদক সহ ওপেন নির্বাচন করুন
  2. এডিএমএক্সে স্টোরটি সন্ধান করুন: স্টোরেজমোডেলস উপাদান
  3. সম্পূর্ণরূপে DefiningQuery সরান
  4. পুনঃনামকরণ store:Schema="dbo"করা Schema="dbo"(অন্যথায়, কোড নাম বলার একটি ত্রুটি উত্পন্ন করবে অবৈধ)

আপনাকে অনেক ধন্যবাদ - ঠিক এটাই আমার সমস্যাটিকে স্থির করেছে। অত্যন্ত বিরক্তিকর যে এটি EF এ স্থির করা হয়নি। এবং, বেশ আশ্চর্যজনক যে আপনি এটি আবিষ্কার করেছেন!
সাইকেল ডেভ

আমি সত্তাটি মোছার এবং পুনরায় যুক্ত করার চেষ্টা করেছি। Recompiling। পরিষ্কারের। এ ছাড়া কিছুই আমার পক্ষে কাজ করেনি।
ভিন্টাস্টিক

1
এটি আমার সমস্যার সমাধান করেছে তবে আমি জানি না আপনি কীভাবে উত্তর নিয়ে এসেছেন এবং কেন আপনার পরামর্শটি সমস্যার সমাধান করেছে।
স্বতঃস্ফীতি

আপনার যদি ডাটাবেস মডেলটি আপডেট করতে হবে তবে কী হবে? আমি একটি "ডেটাবেস থেকে আপডেট মডেল" করেছি এবং এটি আমার মডেলটিকে সম্পূর্ণ অকেজো করে ফেলেছে। আমাকে পূর্বাবস্থায় ফিরে এসে আবার শুরু করতে হয়েছিল। এদিকে যদি কোন উপায় থাকে?
গ্যারি

এটি সত্যিই এক অদ্ভুত বিষয়। এই সমস্যাটি এড়াতে কীভাবে সমস্যা হয় সে সম্পর্কে কোনও তথ্য আছে? তবুও - এটি সহায়তা করেছে
r3dst0rm

41

শুধু লক্ষ করুন যে, হয়তো আপনার সত্তা আছে প্রাথমিক কী কিন্তু ডাটাবেসের মধ্যে আপনার টেবিল নেই প্রাথমিক কী


1
কীভাবে কাটিয়ে উঠব, যদি আমরা ডাটাবেস টেবিলটি পরিবর্তন করতে না পারি?
কাই হার্টম্যান

আপনি যদি ডিবি টেবিলটিকে একটি প্রাথমিক কী হিসাবে পরিবর্তন করতে পারেন তবে কোড জেনারেটর একই ভুল করা বন্ধ করে দেবে, EF থেকে কীটি সরিয়ে ফেললে অন্যান্য অনেক সমস্যা দেখা দেবে।
ক্রিস শ্যাচলার 4

30

আপডেট: আমি ইদানীং এর জন্য কয়েকটি উত্স পেয়েছি, তাই আমি অনুভব করেছি যে আমি নীচে যে পরামর্শ দিচ্ছি তা সর্বোত্তম নয় let যেহেতু আমি মূলত পুরানো চাবিহীন ডেটাবেসগুলিতে সত্তা ফ্রেমওয়ার্কটি নিয়ে মাতামাতি শুরু করেছি, তাই আমি বুঝতে পেরেছি যে আপনি সবচেয়ে ভাল কাজ করতে পারেন তা হল বিপরীত কোড-প্রথম দ্বারা এটি করা। এটি কীভাবে করা যায় সে সম্পর্কে কয়েকটি ভাল নিবন্ধ রয়েছে। কেবল তাদের অনুসরণ করুন এবং তারপরে আপনি যখন এটিতে একটি কী যুক্ত করতে চান, কীটিকে "নকল" করতে ডেটা টীকাটি ব্যবহার করুন।

উদাহরণস্বরূপ, আসুন আমি বলি যে আমি আমার টেবিলটি জানি Orders, যদিও এটিতে প্রাথমিক কী নেই, তবে প্রতি গ্রাহককে কেবলমাত্র একটি আদেশ নম্বর থাকবে বলে আশ্বাস দেওয়া হয়। যেহেতু এগুলি টেবিলের প্রথম দুটি কলাম, তাই আমি কোডটি প্রথম শ্রেণিগুলি এটির মতো দেখতে সেট আপ করতাম:

    [Key, Column(Order = 0)]
    public Int32? OrderNumber { get; set; }

    [Key, Column(Order = 1)]
    public String Customer { get; set; }

এটি করে আপনি মূলত ইএফকে বিশ্বাস করে নকল হন যে অর্ডার নাম্বার এবং গ্রাহকের সমন্বয়ে একটি ক্লাস্টার কী রয়েছে key এটি আপনাকে আপনার কীবিহীন টেবিলে সন্নিবেশ, আপডেট ইত্যাদি করতে দেবে।

যদি আপনি বিপরীত কোড ফার্স্ট করার সাথে খুব বেশি পরিচিত না হন, তবে সত্ত্বা ফ্রেমওয়ার্ক কোড ফার্স্ট সম্পর্কে একটি ভাল টিউটোরিয়ালটি সন্ধান করুন। তারপরে বিপরীত কোডের প্রথমটিতে একটি সন্ধান করুন (যা বিদ্যমান ডাটাবেসের সাথে কোড ফার্স্ট করছে)। তারপরে এখানে ফিরে আসুন এবং আমার মূল পরামর্শটি আবার দেখুন। :)

আসল উত্তর :

প্রথম: অন্যরা যেমন বলেছে, সারণীতে একটি প্রাথমিক কী যুক্ত করা সর্বোত্তম বিকল্প। দাড়ি. আপনি যদি এটি করতে পারেন তবে আর পড়বেন না।

তবে আপনি যদি না করতে পারেন বা কেবল নিজেকে ঘৃণা করেন তবে প্রাথমিক কী ছাড়া এটি করার একটি উপায় আছে way

আমার ক্ষেত্রে, আমি একটি লিগ্যাসি সিস্টেমের সাথে কাজ করছিলাম (মূলত কোনও AS400 এ ফ্ল্যাট ফাইলগুলি অ্যাক্সেসের জন্য পোর্ট করা হয়েছিল এবং তারপরে টি-এসকিউএল পোর্ট করা হয়েছিল)। সুতরাং আমাকে একটি উপায় খুঁজে বের করতে হয়েছিল। এটা আমার সমাধান। নিম্নলিখিতটি আমার জন্য সত্ত্বা ফ্রেমওয়ার্ক 6.0 (এই লেখার মতো নুগেটে সর্বশেষ) ব্যবহার করে কাজ করেছে।

  1. সমাধান এক্সপ্লোরারটিতে আপনার .edmx ফাইলটিতে ডান ক্লিক করুন। "এর সাথে খুলুন ..." চয়ন করুন এবং তারপরে "এক্সএমএল (পাঠ্য) সম্পাদক" নির্বাচন করুন। আমরা এখানে স্বয়ংক্রিয়ভাবে উত্পন্ন কোড হ্যান্ড-এডিট করতে যাচ্ছি।

  2. এর মতো লাইনটি দেখুন:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">

  3. store:Name="table_name"শেষ থেকে সরান ।

  4. পরিবর্তন store:Schema="whatever"করুনSchema="whatever"

  5. সেই লাইনের নীচে দেখুন এবং <DefiningQuery>ট্যাগটি সন্ধান করুন। এটিতে একটি বড় অল 'সিলেক্ট স্টেটমেন্ট থাকবে। ট্যাগটি সরান এবং এর সামগ্রীগুলি।

  6. এখন আপনার লাইনটি দেখতে এই জাতীয় কিছু দেখা উচিত:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />

  7. আমাদের পরিবর্তনের আরও কিছু আছে। আপনার ফাইলের মাধ্যমে যান এবং এটি সন্ধান করুন:
    <EntityType Name="table_name">

  8. কাছাকাছি আপনি সম্ভবত কিছু মন্তব্যযুক্ত টেক্সট আপনাকে সতর্ক করে দেখবেন যে এটিতে একটি প্রাথমিক কী সনাক্ত করা হয়নি, সুতরাং কীটি অনুমান করা হয়েছে এবং সংজ্ঞাটি কেবল পঠনযোগ্য টেবিল / দর্শন। আপনি এটি ছেড়ে বা এটি মুছতে পারেন। আমি এটি মুছে ফেলেছি।

  9. নীচে <Key>ট্যাগ দেওয়া হয় । সন্নিবেশ / আপডেট / মুছে ফেলার জন্য সত্তা ফ্রেমওয়ার্ক এটি ব্যবহার করতে চলেছে। আপনি এই সঠিক কাজটি করে তা নিশ্চিত করুন। এই ট্যাগটিতে থাকা সম্পত্তি (বা বৈশিষ্ট্যগুলি) একটি অনন্য সনাক্তকরণযোগ্য সারি নির্দেশ করতে হবে। উদাহরণস্বরূপ, আসুন আমি বলি যে আমি আমার টেবিলটি জানি orders, যদিও এটিতে প্রাথমিক কী নেই, তবে প্রতি গ্রাহককে কেবলমাত্র একটি আদেশ নম্বর থাকবে বলে আশ্বাস দেওয়া হয়।

আমার মতো দেখতে:

<EntityType Name="table_name">
              <Key>
                <PropertyRef Name="order_numbers" />
                <PropertyRef Name="customer_name" />
              </Key>

সিরিয়াসলি, এই ভুল করবেন না। আসুন আমরা বলি যে ডুপ্লিকেটগুলি কখনই না থাকা উচিত, কোনওভাবে দুটি ক্রম একই ক্রম নম্বর এবং গ্রাহকের নাম সহ আমার সিস্টেমে আসে। Whooops! একটি কী ব্যবহার না করার জন্য আমি এটিই পাই! সুতরাং আমি একটি মুছে ফেলার জন্য সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করি। যেহেতু আমি জানি ডুপ্লিকেটটি কেবল আজই অর্ডার করা হয়েছে, আমি এটি করি:

var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today);
myModel.orders.Remove(duplicateOrder);

কি অনুমান? আমি স্রেফ ডুপ্লিকেট এবং মূল দুটিই মুছলাম! কারণ আমি সত্ত্বা ফ্রেমওয়ার্ককে বলেছি যে অর্ডার_ নাম্বার / কাটোমার_নামটি আমার প্রাথমিক কী। সুতরাং যখন আমি এটি সদৃশ অর্ডার অপসারণ করতে বললাম, ব্যাকগ্রাউন্ডে এটি যা করেছিল তা এমন কিছু ছিল:

DELETE FROM orders
WHERE order_number = (duplicateOrder's order number)
AND customer_name = (duplicateOrder's customer name)

এবং সেই সতর্কতার সাথে ... আপনার এখন ভাল হওয়া উচিত!


সমস্যার একই সমাধান খুঁজে পাওয়ার পরে এই উত্তরটি খুঁজে পেয়েছি। অবশ্যই সঠিক উত্তর! অন্যান্য উত্তরে উল্লিখিত একটি প্রাথমিক কীটি কেবলমাত্র সংজ্ঞায়িত করা অনেক ক্ষেত্রে সহায়তা করবে না।
ওবল টবল

19

ডেটা মডেলটি পুরানো হয়ে থাকলে এটিও ঘটতে পারে।

আশা করি এটি অন্য কারও হতাশাকে রক্ষা করবে :)


6

আমি একই ত্রুটি বার্তা পাচ্ছিলাম, তবে আমার দৃশ্যে আমি পিজেটি (খাঁটি যোগদানের টেবিল) ব্যবহার করে বহু-থেকে-বহু সম্পর্ক থেকে প্রাপ্ত সত্তাগুলি আপডেট করার চেষ্টা করছিলাম।

অন্যান্য পোস্টগুলি পড়া থেকে, আমি ভেবেছিলাম যে যোগদানের টেবিলে একটি অতিরিক্ত পিকে ক্ষেত্র যুক্ত করে আমি এটি সংশোধন করতে পারি ... তবে, আপনি যদি কোনও যোগদানের টেবিলে কোনও পিকে কলাম যুক্ত করেন তবে এটি আর পিজেটি নয় এবং আপনি সমস্তটি হারাবেন সত্তাগুলির মধ্যে স্বয়ংক্রিয় সম্পর্কের ম্যাপিংয়ের মতো সত্তা কাঠামোর সুবিধা।

সুতরাং আমার ক্ষেত্রে সমাধানটি হ'ল ডিবিতে যোগদানের টেবিলটি পরিবর্তিত করে একটি পিকে তৈরি করা যাতে বিদেশী আইডি কলামগুলির উভয়ই অন্তর্ভুক্ত থাকে।


EDMX উত্পাদনের কাজটি কি এইভাবে কাজ করে? আমি কোড ফার্স্টের সাথে কাজ করতে অভ্যস্ত যা খাঁটি যোগদানের টেবিলে কোনও পিকে প্রয়োজন হয় না।
মাইকেল হর্নফেক

4

আপনার টেবিলে প্রাথমিক কী না থাকলে একটি ত্রুটি দেখা দিতে পারে, সেক্ষেত্রে টেবিলটি "কেবল পঠনযোগ্য" এবং db.SaveChanges () কমান্ড সর্বদা একটি ত্রুটি নিয়ে আসবে


4

প্রাথমিক কী সেট করুন তারপরে সারণীটি সংরক্ষণ করুন এবং রিফ্রেশ করুন তারপরে Model.edmx মুছে ফেলা টেবিলটি আবার পান।


3

সুতরাং এটি সত্য, একটি প্রাথমিক কী যুক্ত করুন

দ্রষ্টব্য: নিশ্চিত হন যে আপনি যখন আপনার EF ডায়াগ্রামটি ডাটাবেস থেকে আপডেট করছেন যা আপনি সঠিক ডাটাবেসের দিকে দেখছেন, আমার ক্ষেত্রে সংযোগের স্ট্রিংটি আপ-টু-ডেট দেব ডিবি, স্কুলবয়টির পরিবর্তে কোনও স্থানীয় ডিবিতে নির্দেশ করছে ত্রুটি আমি জানি, তবে আমি এটি পোস্ট করতে চেয়েছিলাম কারণ আপনি প্রাথমিক কীটি যুক্ত করেছেন এবং আপনি এখনও একই ত্রুটি পেয়ে যাচ্ছেন তবে এটি খুব হতাশার হতে পারে


2

আমারও একই প্রশ্ন ছিল. যেহেতু এই থ্রেডটি বলেছে, আমার টেবিলের কোনও পিকে নেই, তাই আমি পিকে সেট করে কোডটি চালিয়েছি। কিন্তু দুর্ভাগ্যক্রমে আবার ত্রুটি এল। আমি এরপরে যা করেছি তা হ'ল, ডিবি সংযোগটি মুছে ফেলা হয়েছে (সমাধান এক্সপ্লোরারের মডেল ফোল্ডারে .edmx ফাইলটি মুছুন) এবং পুনরায় তৈরি করুন। এর পরে ত্রুটি চলে গেছে। আপনার অভিজ্ঞতা ভাগ করে নেওয়ার জন্য সবাইকে ধন্যবাদ। এটি প্রচুর সময় সাশ্রয় করে।


1

আমি এই সমস্যাটি পাচ্ছিলাম কারণ আমি একটি বিদ্যমান ডাটাবেস থেকে আমার ইডিএমএক্স তৈরি করছিলাম (অন্য কারও দ্বারা ডিজাইন করা, এবং আমি এখানে 'ডিজাইন' শব্দটি আলগাভাবে ব্যবহার করি)।

সারণীতে কী কী আছে তা নেই। ইএফ অনেকগুলি একাধিক কী সহ মডেলটি তৈরি করছিল। আমাকে এসকিউএল-তে ডিবি টেবিলের একটি প্রাথমিক কী যুক্ত করতে হবে এবং তারপরে ভিএস-তে আমার মডেলটি আপডেট করতে হয়েছিল

এটা আমার জন্য এটি স্থির।


1

এটি কোনও নতুন উত্তর নয় তবে এমন কাউকে সহায়তা করবে যারা তাদের টেবিলের জন্য কী কী সেট করবেন তা নিশ্চিত নন। এটি একটি নতুন ক্যোয়ারিতে ব্যবহার করুন এবং রান করুন। এটি প্রাথমিক কী হিসাবে ইউনিকআইডি কলাম সেট করবে।

USE [YourDatabaseName]
GO

Alter table  [dbo].[YourTableNname]
Add Constraint PK_YourTableName_UniqueID Primary Key Clustered (UniqueID);
GO

1

এখানে চিত্র বর্ণনা লিখুন

আমার ক্ষেত্রে, টেবিলের প্রাথমিক কীটি সংজ্ঞা দিতে ভুলে গেছেন। সুতরাং চিত্রের মতো দেখানো মতো নির্ধারণ করুন এবং .edmx ফাইল থেকে "ডেটাবেস থেকে আপডেট মডেল" থেকে আপনার টেবিলটি রিফ্রেশ করুন। আশা করি এটি সাহায্য করবে !!!


0

প্রাইমারি কী যুক্ত করা আমার পক্ষেও কাজ করেছিল!

এটি হয়ে গেলে, ডেটা মডেলটিকে মোছা না করে কীভাবে আপডেট করা যায় তা এখানে -

এডিএমএক্স সত্তা ডিজাইনার পৃষ্ঠায় ডান ক্লিক করুন এবং 'ডেটাবেস থেকে আপডেট মডেল'।


0

আমার ঠিক একই সমস্যাটি ছিল, দুর্ভাগ্যক্রমে, প্রাথমিক কী যুক্ত করা সমস্যার সমাধান করে না। সুতরাং আমি এখানে আমার কীভাবে সমাধান করব:

  1. primary keyটেবিলে আপনার একটি রয়েছে তা নিশ্চিত করুন যাতে আমি আমার টেবিলটি পরিবর্তন করে একটি প্রাথমিক কী যুক্ত করি।
  2. Delete the ADO.NET Entity Data Model (এডিএমএক্স ফাইল) যেখানে আমি মানচিত্র তৈরি করতে এবং আমার ডাটাবেসের সাথে সংযোগ করতে ব্যবহার করি।
  3. Add again a new file of ADO.NET Entity Data Model আমার ডাটাবেসের সাথে সংযুক্ত হতে এবং আমার মডেলের বৈশিষ্ট্যগুলি ম্যাপিংয়ের জন্য
  4. Clean and rebuild the solution.

সমস্যা সমাধান.


0

আপনার টেবিলে কেবল একটি প্রাথমিক কী যুক্ত করুন এবং তারপরে আপনার EF পুনরায় তৈরি করুন


0

আমি সবেমাত্র মডেলটি থেকে টেবিলটি সরিয়ে নিয়ে আবার টেবিলটি ফিরিয়ে আনতে মডেলটি আপডেট করতে হয়েছিল। আমার ধারণা, মডেলটিতে টেবিলটি টানানোর পরে প্রাথমিক কী তৈরি করা হয়েছিল।


0

আমার এই সমস্যাটি প্রকাশিত হয়েছিল এবং বিশ্বাস করা হয়েছিল যে এটি কারণ হয়ে গেছে কারণ আমি আমার টেবিলের প্রাথমিক কীতে সূচকটি মুছে ফেলেছি এবং সারণীর অন্যান্য ক্ষেত্রগুলির একটিতে একটি সূচক দিয়ে প্রতিস্থাপন করেছি।

আমি প্রাথমিক কী সূচক মুছে ফেলা এবং এডএমএক্সকে রিফ্রেশ করার পরে, সন্নিবেশগুলি কাজ করা বন্ধ করে দিয়েছে।

আমি টেবিলটি পুরানো সংস্করণে রিফ্রেশ করেছি, এডএমএক্স রিফ্রেশ করেছি এবং সবকিছু আবার কাজ করে।

আমার নোট করা উচিত যে আমি যখন ইডিএমএক্সটি এই সমস্যাটি সমাধানের জন্য খুললাম তখন সেখানে একটি প্রাথমিক কী সংজ্ঞায়িত হয়েছে কিনা তা পরীক্ষা করে দেখছিলাম there সুতরাং উপরের কোনও পরামর্শই আমাকে সহায়তা করছে না। তবে প্রাথমিক কীতে সূচিটি রিফ্রেশ করার কাজটি মনে হয়েছিল।


0

আপনার .edmx ফাইলটি এক্সএমএল সম্পাদকটিতে খুলুন এবং তারপরে ট্যাগ থেকে ট্যাগ সরান এবং স্টোর পরিবর্তন করুন: স্কিমা = "ডিবিও" কে স্কিমা = "ডিবিও" তে পরিবর্তন করুন এবং সমাধানটি পুনর্নির্মাণ করুন ত্রুটিটি সমাধান হবে এবং আপনি ডেটা সংরক্ষণ করতে সক্ষম হবেন।


0

আমার অবস্থাতে .edmx ফাইলের কাজটি আপডেট করার মূল উত্তরটি পেয়েছি। আমি যখনই ডাটাবেস থেকে মডেলটি আপডেট করেছিলাম তখন প্রতিবার পরিবর্তন করার বিষয়ে আমি খুব খুশি ছিলাম না। এই কারণেই আমি একটি অতিরিক্ত পাঠ্য টেম্পলেট ফাইল লিখলাম, সেটি হল মডেলটি পরিবর্তিত হওয়ার পরে অটোমেটিক্যালি - যখন সত্তাগুলি নতুন উত্পন্ন হয় ঠিক তেমন। আমি এখানে এই মন্তব্য পোস্ট। এটি কার্যকর করার জন্য, নিশ্চিত করুন যে আপনি এটির নাম {মডেল নাম} .সোমথিং.টি-এর মতো রেখেছেন এবং এটি আপনার .edmx ফোল্ডারের মতো একই ফোল্ডারে সঞ্চয় করবেন। আমি এটির নাম দিয়েছি {মডেল নাম} .নোনপেকটাবেলস.টি। এটি দ্বিতীয় লাইনে অবৈধ ফাইল এক্সটেনশন সংজ্ঞার কারণে এটি নিজেই একটি ফাইল তৈরি করে না। বিনামূল্যে নির্দ্বিধায়।

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ output extension="/" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\EntityFramework.dll" #>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\Microsoft.Data.Entity.Design.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Mapping" #>
<#@ import namespace="System.CodeDom" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Diagnostics" #>

<#
    string modelFileName= this.Host.TemplateFile.Split('.')[0] + ".edmx";
    string edmxPath = this.Host.ResolvePath( modelFileName );

    // MessageBox.Show( this.Host.TemplateFile + " applied." );
    var modelDoc = XDocument.Load(edmxPath);
    var root = modelDoc.Root;
    XNamespace nsEdmx = @"http://schemas.microsoft.com/ado/2009/11/edmx";
    XNamespace ns = @"http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

    var runtime = root.Elements(nsEdmx + "Runtime").First();
    var storageModels = runtime.Elements(nsEdmx + "StorageModels").First();
    XNamespace nsStore = @"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator";

    var schema = storageModels.Elements(ns + "Schema").First();
    XNamespace nsCustomAnnotation = @"http://schemas.microsoft.com/ado/2013/11/edm/customannotation";

    var entityTypes = schema.Nodes().OfType<XComment>().Where(c => c.Value.Contains("warning 6002: The table/view"));
    bool changed = false;

    foreach (var node in entityTypes)
    {
        var element = node.ElementsAfterSelf().First();
        string entityName = element.Attribute("Name").Value;

        // Find EntitySet in EntityContainer.
        var entityContainer = schema.Elements(ns + "EntityContainer").First();
        var entitySet = entityContainer.Elements(ns + "EntitySet").First(s => s.Attribute("Name").Value == entityName);

        // Change "store:Schema" attribute to "Schema" attribute.
        var attribute = entitySet.Attribute(nsStore + "Schema");

        if (attribute != null)
        {
            string schemaName = entitySet.Attribute(nsStore + "Schema").Value;
            entitySet.Attribute(nsStore + "Schema").Remove();
            entitySet.Add(new XAttribute("Schema", schemaName));
            changed |= true;
        }

        // Remove the DefiningQuery element.
        var definingQuery = entitySet.Element(ns + "DefiningQuery");

        if (definingQuery != null)
        {
            definingQuery.Remove();
            changed |= true;        
            Debug.WriteLine(string.Format("Removed defining query of EntitySet {0}.", entityName));
        }
    }

    if (changed)
        modelDoc.Save(edmxPath);
#>

-1

বহু-থেকে-বহু সম্পর্ক থাকা কোনও টেবিলে একটি রেকর্ড সন্নিবেশ করানোর জন্য আমি একই ত্রুটির বার্তার মুখোমুখি হয়েছি । আমার ডাটাবেস স্কিমাটি ছিল:

Student (Id , Name)
Course (Code , Title),
Student-Course (Student_ID, Course_Code)

সারণী ছাত্র এবং কোর্সের প্রাথমিক কী আইডি এবং কোড রয়েছে যথাক্রমে সারণী ছাত্র-কোর্স শিক্ষার্থী এবং কোর্স সারণীর সাহায্যে দুটি বিদেশী কী ম্যাপ করা আছে।

যৌক্তিকভাবে, স্কিমাটি সঠিক তবে আমি ডাটাবেজে একটি ভুল করছি, কারণ প্রতিটি টেবিলে একটি প্রাথমিক কী থাকা উচিত।

শিক্ষার্থী-কোর্সের জন্য আমার স্কয়ার সংজ্ঞাটি ছিল:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

আমি এই টেবিলের প্রাথমিক কীটি জোড়া তৈরি করেছিলাম এবং এতে আপডেট করেছি:

CREATE TABLE [dbo].[Student-Course] (
    [StudentID]  VARCHAR (12) NOT NULL,
    [CourseCode] VARCHAR (10) NOT NULL,
    CONSTRAINT [PK_Student-Course] PRIMARY KEY CLUSTERED ([Student_ID] ASC, [Course_Code] ASC),
    CONSTRAINT [FK_Student-Course_ToCourse] FOREIGN KEY ([Course_Code]) REFERENCES [dbo].[Course] ([Code]) ON DELETE CASCADE,
    CONSTRAINT [FK_Student-Course_ToStudent] FOREIGN KEY ([Student_ID]) REFERENCES [dbo].[Student] ([Id]) ON DELETE CASCADE
);

আশা করি এটি কিছু ছেলেদের সমস্যার সমাধান করবে।


এই প্রশ্নের ইতিমধ্যে অনেকগুলি উত্তর রয়েছে। তদুপরি, প্রায় প্রতিটি উত্তর বলেছে "একটি প্রাথমিক কী যুক্ত করুন" এবং একটি এটি বহু-থেকে-অনেকের প্রসঙ্গে does
গার্ট আর্নল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.