সত্তা ফ্রেমওয়ার্ক: প্রাথমিক কী ছাড়া টেবিল


165

আমার একটি বিদ্যমান ডিবি রয়েছে যার সাহায্যে আমি একটি নতুন অ্যাপ্লিকেশন ব্যবহার করে তৈরি করতে চাই EF4.0

কিছু টেবিলে প্রাথমিক কীগুলি সংজ্ঞায়িত করা হয় না যাতে যখন আমি একটি নতুন সত্তা ডেটা মডেল তৈরি করি, তখন আমি নিম্নলিখিত বার্তাটি পাই:

The table/view TABLE_NAME does not have a primary key defined 
and no valid primary key could be inferred. This table/view has 
been excluded. To use the entity, you will need to review your schema, 
add the correct keys, and uncomment it.

আমি যদি সেগুলি ব্যবহার করতে এবং ডেটা সংশোধন করতে চাই, তবে আমাকে অবশ্যই এই টেবিলগুলিতে একটি পিকে যুক্ত করতে হবে, বা আমার কোনও টান নেই?


21
জো সেলকোকে উদ্ধৃত করার জন্য: এটির যদি প্রাথমিক কী না থাকে তবে এটি কোনও টেবিল নয় । কেন পৃথিবীতে কেউ প্রাইমারী কী ছাড়াই "নিয়মিত" টেবিল তৈরি করবে ?? শুধু যারা পিকে যোগ করুন! আপনার
এগুলির

4
তার একটি এই hava দেখে এই ক্ষেত্রে দেখতে হলে stackoverflow.com/a/10302066/413032
Davut Gürbüz

50
এটি পুরোপুরি বৈধ যে প্রতিটি টেবিলের জন্য প্রাথমিক কী প্রয়োজন হয় না। প্রায়শই দরকারী না, তবে বৈধ। কনফিউজিং ইএফ একটি ভাল কারণ, এটি বেশি লাগে না তা নয়। ;-)।
সানকাট 2000

25
কল্পনা করুন যে আমি আমার সংস্থার ডিবি কাঠামোটি সংশোধন করতে পারছি না এবং এটি এমন কেউ তৈরি করেছিলেন যে টেবিলের কাঠামোটি বদলাবে না, এই দৃশ্যটি সম্ভব।
টিটো

4
ঠিক এখানেই আমরা আছি আমাদের তৃতীয় পক্ষের ওরাকল ডাটাবেসের সাথে কাজ করতে হবে যার কোনও প্রাথমিক কী নেই।
ডেভিড ব্রোয়ার

উত্তর:


59

ত্রুটিটির অর্থ হ'ল এটি কী বলে।

এমনকি আপনি যদি এটিকে ঘিরে কাজ করতে পারেন তবে বিশ্বাস করুন, আপনি চান না। যে বিভ্রান্তিকর বাগগুলি প্রবর্তন করা যেতে পারে তা হ'ল স্তম্ভিত এবং ভীতিজনক, আপনার অভিনয়টি সম্ভবত টিউবগুলিতে নেমে যাবে এই বিষয়টি উল্লেখ না করে।

এই চারপাশে কাজ করবেন না। আপনার ডেটা মডেল ঠিক করুন।

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

কেউ কেউ মন্তব্য করেছেন যে তাদের মধ্যে অন্তর্নিহিত ডেটা মডেলটি ঠিক করার ক্ষমতা নেই কারণ তারা তৃতীয় পক্ষের অ্যাপ্লিকেশনটিতে ম্যাপিং করছে। মডেলটি আপনার অধীনে থেকে পরিবর্তিত হতে পারে বলে এটি কোনও ভাল ধারণা নয়। যুক্তিযুক্তভাবে, সেক্ষেত্রে আপনি এমন একটি দৃশ্যে মানচিত্র তৈরি করতে চান, যা ওপি যা বলেছিল তা নয়।


44
সাধারণ সেনারিওগুলিতে সম্মত হন তবে এলওজি টেবিলের মতো বিরল সেনারিওগুলিতে আপনাকে কেবল ASAP রেকর্ড সন্নিবেশ করাতে হবে। স্বতন্ত্রতা পরীক্ষা করার সময় পিকে থাকা সমস্যা হতে পারে এবং সূচীকরণ ঘটে happens এছাড়াও যদি আপনার পিকে পরিচয় হয় তবে উত্পন্ন মানটি ইএফ-এ ফিরিয়ে দেওয়া অন্য বিষয়। পরিবর্তে জিইউডি ব্যবহার করছেন? প্রজন্মের সময় এবং সূচিকরণ / বাছাই করা আরেকটি সমস্যা! ... সুতরাং কিছু সমালোচিত ওলটিপি সেনারিও (যেমন লগিং) পিকে না থাকা একটি বিষয় এবং এটির কোনও ইতিবাচক বিন্দু নেই!
মাহমুদ মোরাভেজ

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

149
"আপনার ডেটা মডেলটি ঠিক করুন" একটি আসল উত্তর নয়। কখনও কখনও আমাদের তুলনায়-আদর্শ পরিস্থিতি নিয়ে বাঁচতে হয় যা আমরা তৈরি করি নি এবং পরিবর্তন করতে পারি না। এবং @ কলিন যেমন বলেছিলেন, ওপি যা বলছে ঠিক তা করার একটা উপায় আছে।
TheSmurf

13
ইএফকে সন্তুষ্ট করার জন্য কোড পরিবর্তন করা নিজেই একটি কাজ। সমস্ত টেবিলের জন্য প্রাথমিক কী প্রয়োজন হয় না বা সেগুলি বাধ্য করা উচিত নয়। যেমন আপনি একটি বিষয় এবং এটিতে 0 বা অনেকগুলি কীওয়ার্ড রয়েছে। কীওয়ার্ড সারণীতে একটি প্যারেন্ট টপিক আইডি এবং একটি সম্পর্কিত কীওয়ার্ড থাকতে পারে। এটি বলতে যে আমাকে আমার ডিবি পুনরায় তৈরি করতে হবে ইএফ আমাকে লম্পট হতে বাধ্য করেছে।
মিচিফ

14
এটি হ্রাস করা উচিত কারণ এটি প্রশ্নের উত্তর দেয় না। আমাদের প্রায়শই তৃতীয় পক্ষের ডেটাবেসগুলির সাথে কাজ করা দরকার যা পরিবর্তন করা যায় না।
কুড়েন

104

আমি মনে করি এটি টিলিতো দ্বারা সমাধান করা হয়েছে:

সত্তা ফ্রেমওয়ার্ক এবং এসকিউএল সার্ভার দেখুন

আমি তার প্রবেশ নীচে উদ্ধৃত করব:

আমাদের একই সমস্যা ছিল এবং এটিই সমাধান:

প্রাথমিক কী হিসাবে কোনও কলামটি সত্ত্বার কাঠামোকে বাধ্য করতে, ইসনুল ব্যবহার করুন।

প্রাথমিক কী হিসাবে কোনও কলামটি কলাম ব্যবহার না করার জন্য সত্তা কাঠামোকে বাধ্য করতে, নুলিফ ব্যবহার করুন।

এটি প্রয়োগ করার একটি সহজ উপায় হ'ল আপনার ভিউয়ের নির্বাচিত বিবৃতিটি অন্য একটি নির্বাচনের মধ্যে মোড়ানো।

উদাহরণ:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

টিলিটো দ্বারা 26 এপ্রিল '10 এ 17 টি উত্তর দিয়েছেন


6
+1 এটি সঠিক উত্তর, একটি নিখুঁত বিশ্বে জেনারেল অখণ্ডতা থাকতে সমস্ত উত্তরাধিকারের ডেটাবেসগুলিতে প্রবেশ করা এবং এটি পরিবর্তন করা দুর্দান্ত হবে তবে বাস্তবে এটি সর্বদা সম্ভব হয় না।
ডিলান হেইস

9
আমি এটি সুপারিশ করব না। বিশেষত ISNULL অংশ। যদি EF দুটি পিকে একই শনাক্ত করে তবে এটি অনন্য রেকর্ড (গুলি) রেন্ডার করতে না পারে এবং পরিবর্তে একটি ভাগ করা অবজেক্টকে ফেরত দিতে পারে। আমার সাথে এর আগেও এই ঘটনা ঘটেছে।
টড

@ টড - মাইপ্রাইমারিআইডি একটি নাল কলাম না থাকলে কীভাবে তা ঘটতে পারে?
জোকুল

@ জোকুল, কেবল কারণ এটি অকার্যকর নয় এর অর্থ এটি অনন্য নয়। আমি "এই সমাধানের কাজগুলি ..." কে অগ্রাহ্য করেছি, কারণ এটি যে প্রসঙ্গে ব্যবহৃত হয়েছে তা বিবেচনা না করেই আপনি স্বতন্ত্রতা নিশ্চিত করতে পারবেন। যদিও এখন এটি সম্পর্কে চিন্তা করা হচ্ছে, যদি এমন কোনও রেকর্ড মুছে ফেলা হয় যা নিম্নলিখিত রেকর্ডগুলির কার্যকরভাবে পরিবর্তন করবে "" পিকে "।
টড

1
-1, কারণ এটি কোনও পরিচয় বীজের অভাবের কোনও টেবিলটিতে কীভাবে ম্যাপ করবেন সেই বিষয়ে কীভাবে সত্তা ফ্রেমওয়ার্ক / সি # কোডটি কনফিগার করবেন তা উত্তর দেয় না। কিছু তৃতীয় পক্ষের সফ্টওয়্যার (কোনও কারণে) এইভাবে লেখা হয়েছে।
অ্যান্ড্রু গ্রে

27

আমি যদি সেগুলি ব্যবহার করতে এবং ডেটা সংশোধন করতে চাই, তবে আমাকে অবশ্যই এই টেবিলগুলিতে একটি পিকে যুক্ত করতে হবে, বা আমার কোনও টান নেই?

যারা এই প্রশ্নে পৌঁছেছেন এবং সত্তা ফ্রেমওয়ার্ক কোর ব্যবহার করছেন তাদের জন্য আপনার আর প্রয়োজন হয় না যে টেক্সট টেবিলগুলিতে বা কোনও কাজ করার দরকার নেই। EF কোর 2.1 সাল থেকে আমাদের একটি নতুন বৈশিষ্ট্য অনুসন্ধানের প্রকার রয়েছে es

অনুসন্ধানের ধরণগুলি অবশ্যই এর জন্য ব্যবহার করা উচিত:

  • অ্যাডহক ফোর এসকিএল () প্রশ্নের জন্য রিটার্ন টাইপ হিসাবে পরিবেশন করা।
  • ডাটাবেস দর্শনে ম্যাপিং।
  • প্রাথমিক কী সংজ্ঞায়িত করা হয়নি এমন টেবিলগুলিতে ম্যাপিং।
  • মডেলটিতে সংজ্ঞায়িত প্রশ্নের ম্যাপিং।

সুতরাং আপনার DbContext এ নীচের মতো DbQuery<T>পরিবর্তে নিম্নলিখিত ধরণের সম্পত্তি যুক্ত করুন DbSet<T>। আপনার টেবিলের নামটি ধরে নেওয়া MyTable:

public DbQuery<MyTable> MyTables { get; set; }

1
আপনি যদি EF কোর ব্যবহার করছেন তবে সেরা উত্তর!
জয়

17

সম্মিলিত কীগুলি সত্তা ফ্রেমওয়ার্ক ফ্লুয়েন্ট এপিআই দিয়েও করা যেতে পারে

public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
     public MyModelConfiguration()
     {
        ToTable("MY_MODEL_TABLE");
        HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
        ...
     }
}

এই ধরণের 'ম্যানুয়াল ম্যাপিং' ক্ষেত্রে, আমি দেখতে পেলাম যে আপনি প্রদর্শিত হিসাবে একটি কাস্টম কী নির্দিষ্ট করা কার্যকর; তদ্ব্যতীত, যদি আপনার কোনও সংমিশ্রিত কীটির সুবিধা না থাকে (এই উত্তর হিসাবে দেখানো হয়েছে) আপনি প্রাকৃতিক বা সংমিশ্রিত না হয়ে ওহ-তাই-বিশেষ কীগুলির জন্য একটি modelBuilder.Entity<T>()চেইন-কল ট্যাগ .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)করতে পারেন তবে নির্ভর করতে পারবেন অনন্য হতে হবে (সাধারণত, যাইহোক।)
অ্যান্ড্রু গ্রে

5

আমার ক্ষেত্রে আমাকে একটি ভিউতে একটি সত্তা মানচিত্র করতে হয়েছিল, যার প্রাথমিক কী নেই। তদতিরিক্ত, আমাকে এই ভিউটি সংশোধন করার অনুমতি দেওয়া হয়নি। ভাগ্যক্রমে, এই দৃশ্যের একটি কলাম ছিল যা একটি অনন্য স্ট্রিং ছিল। আমার সমাধানটি ছিল এই কলামটিকে প্রাথমিক কী হিসাবে চিহ্নিত করা:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[StringLength(255)]
public string UserSID { get; set; }

প্রতারিত EF। নিখুঁতভাবে কাজ করেছেন, কেউ খেয়াল করেননি ... :)


না .. এটি UserIDকোডটি প্রথম ব্যবহার করে যদি কলামটি তৈরি করে ..!
দীপক শর্মা

1
আপনি EF কে প্রতারণা করেন নি। আপনি কেবল Itentityফাংশন স্যুইচ অফ করার আদেশ দিয়েছেন commanded মূলত, আমি যদি সঠিক হয়ে থাকি UserIDতবে এটি পিকে হিসাবে আপনার জন্য কলাম তৈরি করতে চলেছে তবে UserIDআপনি যখন নতুন রেকর্ড তৈরি করবেন তখন এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে না default এছাড়াও, আপনার এখনও আলাদা মান রাখতে হবে UserID
Celdor

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

4

EF ডাটাবেসের একটি প্রাথমিক কী প্রয়োজন হয় না। এটি যদি হয়, আপনি সত্ত্বাকে দর্শনগুলিতে আবদ্ধ করতে পারবেন না।

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

এরিক


এটি ইসনুল হ্যাক এড়িয়ে চলে। তবে পরিস্থিতির উপর নির্ভর করে অন্যান্য উত্তরগুলির প্রয়োজন হতে পারে - আমার একটি অনুভূতি আছে যে উদাহরণস্বরূপ ইএফ-তে কোনও পিকে জন্য কিছু ডেটা টাইপ সমর্থিত নয়।
টড

3

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


3

এই সমাধান কাজ করে

আপনার কাছে পিকে না থাকলেও আপনাকে ম্যানুয়ালি মানচিত্রের প্রয়োজন হবে না। আপনাকে কেবল ইএফকে বলতে হবে যে আপনার কলামগুলির মধ্যে একটি সূচক এবং সূচক কলামটি প্রবণ নয়।

এটি করার জন্য আপনি নীচের মত নাস ফাংশন দিয়ে আপনার ভিউতে একটি সারি নম্বর যুক্ত করতে পারেন

select 
    ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id
from a

ISNULL(id, number) এটি এখানে মূল পয়েন্ট কারণ এটি EF কে বলে যে এই কলামটি প্রাথমিক কী হতে পারে


2
যদিও আমি ISNULL অংশটি প্রস্তাব করব না। যদি EF দুটি পিকে একই শনাক্ত করে তবে এটি অনন্য রেকর্ডটি রেন্ডার করতে পারে না এবং পরিবর্তে একটি ভাগ করা অবজেক্টকে ফিরিয়ে দিতে পারে। আমার সাথে এর আগেও এই ঘটনা ঘটেছে।
টড

1
আপনাকে isnull ব্যবহার করতে হবে, অন্যথায় EF এটি নমনীয় নয় যে বিস্মৃত হবে না।
আর্কলাইট

2

উপরোক্ত উত্তরগুলি সঠিক যদি আপনার কাছে সত্যিই কোনও পিকে না থাকে।

তবে যদি এটির একটি থাকে তবে এটি কেবল ডিবিতে একটি সূচক দিয়ে নির্দিষ্ট করা হয়নি, এবং আপনি ডিবি পরিবর্তন করতে পারবেন না (হ্যাঁ, আমি দিলবার্টের জগতে কাজ করি) আপনি ক্ষেত্রটি (গুলি) ম্যানুয়ালি ম্যাপ করতে পারেন key


2

এটি @ এরিক টি-র উত্তরের একটি সংযোজন। যদি অনন্য মানগুলির সাথে কোনও একক কলাম না থাকে, তবে কার্যকারণটি হ'ল একটি সংমিশ্রিত কী ব্যবহার করা উচিত:

[Key]
[Column("LAST_NAME", Order = 1)]
public string LastName { get; set; }

[Key]
[Column("FIRST_NAME", Order = 2)]
public string FirstName { get; set; }

আবার, এটি কেবল একটি কাজ। আসল সমাধান হ'ল ডেটা মডেল ঠিক করা।


2

উত্তর হতে দেরি হতে পারে ... তবে ...

যদি কোনও টেবিলে প্রাথমিক কী না থাকে তবে EF সঠিকভাবে কাজ করার জন্য কয়েকটি পরিস্থিতি বিশ্লেষণ করা দরকার। নিয়মটি হল: ইএফ প্রাথমিক কী সহ টেবিল / ক্লাসে কাজ করবে। এভাবেই এটি ট্র্যাকিং করে ...

বলুন, আপনার টেবিলটি 1. রেকর্ডগুলি অনন্য: স্বতন্ত্রতাটি একটি একক বিদেশী কী কলাম দ্বারা তৈরি করা হয়: ২. রেকর্ডগুলি অনন্য: একাধিক কলামের সংমিশ্রণ দ্বারা স্বতন্ত্রতা তৈরি করা হয়। ৩. রেকর্ডগুলি অনন্য নয় (বেশিরভাগ অংশের জন্য)।

# 1 এবং # 2 দৃশ্যের জন্য আপনি নিম্নোক্ত লাইনটি ডিবিকন্টেক্সট মডিউল অনমোডেলক্রিয়াটিং পদ্ধতিতে যুক্ত করতে পারেন: মডেলবিল্ডার.এন্টিটি () Has // রেকর্ডগুলি অনন্য করতে যতগুলি কলাম এটি লাগে takes

# 3 দৃশ্যের জন্য আপনি টেবিলটি অধ্যয়ন করার পরেও উপরের সমাধানটি (# 1 + # 2) ব্যবহার করতে পারেন (* যাইহোক সমস্ত রেকর্ডকে অনন্য করে তোলে)। সমস্ত রেকর্ডকে অনন্য করতে আপনার যদি অবশ্যই সমস্ত কলামগুলি অন্তর্ভুক্ত থাকতে পারে তবে আপনি নিজের টেবিলটিতে একটি প্রাথমিক কী কলামটি যুক্ত করতে পারেন। যদি এই টেবিলটি কোনও তৃতীয় পক্ষের বিক্রেতার কাছ থেকে এই টেবিলটিকে আপনার স্থানীয় ডাটাবেসে ক্লোন করুন (রাতারাতি বা আপনার যত সময় প্রয়োজন) আপনার ক্লোন স্ক্রিপ্টের মাধ্যমে প্রাথমিক কী কলামটি স্বেচ্ছাসেবী যুক্ত করা হয়।


1
  1. সারণির কাঠামো পরিবর্তন করুন এবং একটি প্রাথমিক কলাম যুক্ত করুন। মডেল আপডেট করুন
  2. এক্সএমএল সম্পাদকে .EDMX ফাইলটি সংশোধন করুন এবং এই নির্দিষ্ট সারণির জন্য ট্যাগের অধীনে একটি নতুন কলাম যুক্ত করার চেষ্টা করুন (কাজ করবে না)
  3. প্রস্থানকারী টেবিলটিতে একটি নতুন প্রাথমিক কলাম তৈরি করার পরিবর্তে, বিদ্যমান বিদ্যমান সমস্ত কলামগুলি ( ওয়ার্কড ) জড়িত করে একটি সমন্বিত কী তৈরি করব

সত্তা ফ্রেমওয়ার্ক: সত্তা মডেলের কোনও প্রাথমিক কী ছাড়াই ডেটা টেবিল যুক্ত করা।


আমি EF 4.0 এর সাথে যৌগিক কী পদ্ধতির চেষ্টা করেছি এবং এটি কার্যকর হয়নি।
রাল্ফ উইলগাস


1

@ কোডডনটফাউন্ডের উত্তরে আপডেট করুন ।

EF- তে কোর 3.0 অবমূল্যায়ন DbQuery<T>করা হয়েছে, পরিবর্তে আপনার চাবিহীন সত্তার প্রকারগুলি ব্যবহার করা উচিত যা সম্ভবত একই কাজ করে। এগুলি মডেলবিল্ডার HasNoKey()পদ্ধতিতে কনফিগার করা আছে । আপনার ডিবি কনটেক্সট ক্লাসে এটি করুন

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<YourEntityType>(eb =>
        {
            eb.HasNoKey();
        });

}

যদিও বিধিনিষেধগুলি রয়েছে:

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

এর অর্থ এটি যে প্রশ্নের জন্য

আমি যদি সেগুলি ব্যবহার করতে এবং ডেটা সংশোধন করতে চাই, তবে আমাকে অবশ্যই এই টেবিলগুলিতে একটি পিকে যুক্ত করতে হবে, বা আমার কোনও টান নেই?

আপনি এইভাবে ডেটা পরিবর্তন করতে পারবেন না - তবে আপনি পড়তে পারেন। ডেটা পরিবর্তনের জন্য অন্য কোনও উপায়ে (যেমন ADO.NET, Dapper) ব্যবহার করে কেউ কল্পনা করতে পারে - যদিও এটি আপনার ক্ষেত্রে খুব কম ক্ষেত্রে অপ্রত্যাশিত অপারেশন করার খুব কম প্রয়োজন এবং এখনও আপনার সংখ্যাগরিষ্ঠ ক্ষেত্রে EF কোরের সাথে লেগে থাকতে চান।

এছাড়াও, যদি আপনার হ্যাপ (কীলেস) টেবিলগুলি সহ সত্যই প্রয়োজন হয় / কাজ করতে চান - EF খনন বিবেচনা করুন এবং আপনার ডাটাবেসের সাথে কথা বলার জন্য অন্য উপায় ব্যবহার করুন।


0

ব্যবহারিক দৃষ্টিকোণ থেকে, প্রতিটি টেবিল - এমনকি একটি গুদাম টেবিলের মতো একটি অস্বীকৃত টেবিল - এর একটি প্রাথমিক কী থাকা উচিত। বা, এটি ব্যর্থ হয়ে, এটির কমপক্ষে একটি অনন্য, নন-অ্যানালেক্স সূচক থাকা উচিত।

কোনও ধরণের অনন্য কী ছাড়া, নকল রেকর্ডগুলি টেবিলে উপস্থিত হতে পারে (এবং হবে) যা ওআরএম স্তরগুলির জন্য এবং ডেটাগুলির প্রাথমিক বোঝার জন্য উভয়ই বেশ সমস্যাযুক্ত। সদৃশ রেকর্ড থাকা একটি টেবিলটি সম্ভবত খারাপ ডিজাইনের লক্ষণ।

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


আমার অ্যাপ্লিকেশনটি ডেটা গুদাম সেটিংয়ে রয়েছে (ওরাকল সহ) এবং আপনি আমাকে সূচি যোগ করার জন্য 5 মিনিটের মধ্য দিয়ে যেতে রাজি করেছিলেন। এটিতে মাত্র 5 মিনিট সময় লাগে (বা যদি আপনি এটিটি সন্ধান করার বা ইটিএলগুলি সংশোধন করার প্রয়োজন হয় তবে কিছুটা বেশি )।
ট্রেন্ট

0

আমরাও এই সমস্যার মুখোমুখি হয়েছিলাম, এবং যখন আমাদের কাছে একটি কলাম ছিল যার নাল ছিল, তবে গুরুত্বপূর্ণটি হ'ল আমাদের একটি নির্ভরশীল কলাম ছিল যার নাল ছিল না এবং এই দুটি কলামের সংমিশ্রণটি অনন্য ছিল।

সুতরাং প্রতাপ রেড্ডির দেওয়া প্রতিক্রিয়াটি উদ্ধৃত করতে, এটি আমাদের পক্ষে ভাল কাজ করেছে।


0

আমি খুব খুশি আমার সমস্যাটির সমাধান হয়েছে।

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

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

এখন ডিবি টিআই পরিবর্তন না করে এমন কোনও টেবিলের মধ্যে সন্নিবেশ করতে পারে যা পিকে নেই

সকলকে ধন্যবাদ এবং ফ্যারিলনকে ধন্যবাদ জানাই


0

EF কোর 5.0 এ আপনি সত্তা স্তরেও এটি সংজ্ঞায়িত করতে সক্ষম হবেন।

[Keyless]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public int Zip { get; set; }
}

তথ্যসূত্র: https://docs.microsoft.com/en-us/ef/core/ কি-is-new/ ef- core-5.0/ whatnew# use-ac-attribute-to-indicate-that-an- entity- হয়েছে-কোন-কি


-8

টেবিলটিতে কেবল একটি কলাম থাকা দরকার যা নালগুলিকে অনুমতি দেয় না

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