Asp.net এন্টি ফ্রেমওয়ার্ক নিয়ে আমার সমস্যা আছে। আমি যখনই ডাটাবেসে কোনও বস্তু যুক্ত করি তখন আইডি মানটি পেতে চাই। কিভাবে আমি এটি করতে পারব?
Asp.net এন্টি ফ্রেমওয়ার্ক নিয়ে আমার সমস্যা আছে। আমি যখনই ডাটাবেসে কোনও বস্তু যুক্ত করি তখন আইডি মানটি পেতে চাই। কিভাবে আমি এটি করতে পারব?
উত্তর:
এটা বেশ সহজ। আপনি ব্যবহার করে থাকেন ডিবি উত্পন্ন Id গুলি (যেমন IDENTITYমাইক্রোসফট SQL এর যে) আপনি শুধু সত্তা যোগ করতে হবে ObjectSetএবং SaveChangesএর সাথে সম্পর্কিত উপর ObjectContext। Idআপনার জন্য স্বয়ংক্রিয়ভাবে পূরণ করা হবে:
using (var context = new MyContext())
{
context.MyEntities.Add(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
ডিফল্টরূপে সত্তা কাঠামো প্রতিটি স্বতঃ উত্পাদিত ব্যবহৃত INSERTহয় SELECT SCOPE_IDENTITY()যখন অনুসরণ করে Id।
সত্তা ফ্রেমওয়ার্কটি ব্যবহার করার সময় আমি আইডিগুলি সফলভাবে পুনরুদ্ধার করার জন্য লাদিস্লাভ মির্ণকার উত্তরটি ব্যবহার করছিলাম তবে আমি এখানে পোস্ট করছি কারণ আমি এটি মিস করছি (যেমন এটি প্রয়োজন ছিল না সেখানে ব্যবহার করছি) এবং ভেবেছিলাম যে আমি আমার অনুসন্ধানগুলি এখানে পোস্ট করব - কেস লোকেরা আমার যে সমস্যাটি হয়েছিল তা "সমাধান" করতে চাইছে।
একটি অর্ডার অবজেক্ট বিবেচনা করুন যা গ্রাহকের সাথে বিদেশী কী সম্পর্ক রয়েছে। আমি যখন একই সময়ে একটি নতুন গ্রাহক এবং একটি নতুন অর্ডার যুক্ত করেছি তখন আমি এই জাতীয় কিছু করছিলাম;
var customer = new Customer(); //no Id yet;
var order = new Order(); //requires Customer.Id to link it to customer;
context.Customers.Add(customer);
context.SaveChanges();//this generates the Id for customer
order.CustomerId = customer.Id;//finally I can set the Id
তবে আমার ক্ষেত্রে এটির প্রয়োজন ছিল না কারণ গ্রাহকআইআরআইড এবং অর্ডার-কাস্টমারের আইডির মধ্যে আমার একটি বিদেশী কী সম্পর্ক ছিল
আমাকে যা করতে হয়েছিল তা হ'ল;
var customer = new Customer(); //no Id yet;
var order = new Order{Customer = customer};
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order
এখন আমি যখন পরিবর্তনগুলি সংরক্ষণ করি তখন গ্রাহকের জন্য তৈরি করা আইডিটিও অর্ডার যুক্ত করা হয়। আমার অতিরিক্ত পদক্ষেপের দরকার নেই
আমি জানি যে এটি আসল প্রশ্নের উত্তর দেয় না তবে ভেবেছিল যে এটি এমন বিকাশকারীদের সাহায্য করতে পারে যা EF তে নতুন যারা উচ্চ প্রয়োজনে এমন উত্তরের জন্য অতিরিক্ত ভোটের উত্তরটি ব্যবহার করতে পারে না যা প্রয়োজন হয় না।
এর অর্থ হ'ল আপডেটগুলি একক লেনদেনে সম্পূর্ণ হয়, সম্ভাব্যভাবে অরফিন ডেটা এড়ানো হয় (হয় সমস্ত আপডেট সম্পূর্ণ হয়, না কিছুই হয়)।
পরিবর্তনগুলি সংরক্ষণের পরে আপনাকে সত্তাটি পুনরায় লোড করা দরকার। কারণ এটি একটি ডাটাবেস ট্রিগার দ্বারা পরিবর্তিত হয়েছে যা ইএফ দ্বারা ট্র্যাক করা যায় না। সুতরাং আমাদের সত্তাকে আবার ডিবি থেকে পুনরায় লোড করা দরকার,
db.Entry(MyNewObject).GetDatabaseValues();
তারপর
int id = myNewObject.Id;
নীচের প্রশ্নের @ জয়ন্তের উত্তরটি দেখুন:
ডিফল্টভ্যালু ব্যবহার করার সময় সত্তা কাঠামোর মধ্যে সন্নিবেশিত সত্তার আইডি আমি কীভাবে পেতে পারি?
নীচে প্রশ্নের উত্তর ক্রিশ্চিয়ানের উত্তর খুঁজছেন এছাড়াও সাহায্য করতে পারে:
.GetDatabaseValues();আপনি যদি কেবলমাত্র আপনার মডেলটি ডিবি-তে সংরক্ষণ করেন তবে তা করার দরকার নেই । আইডিটি স্বয়ংক্রিয়ভাবে মডেলটিতে পুনরায় প্রকাশ করা উচিত।
GetDatabaseValues()যদি এটি ডাটাবেসে অনুসন্ধান করার জন্য অবজেক্টটির আইডি না জানত?
এই লিঙ্কটি উল্লেখ করুন।
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
আপনাকে স্টোরজেনেটেড প্যাটার্নের সম্পত্তি পরিচয় হিসাবে সেট করতে হবে এবং তারপরে আপনার নিজের কোডটি চেষ্টা করতে হবে।
অন্যথায় আপনি এটি ব্যবহার করতে পারেন।
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
StoreGeneratedPatternআমার জন্য অনুপস্থিত অংশ ছিল।
আপনি যে জিনিসটি সংরক্ষণ করছেন Idতা ডাটাবেসে পরিবর্তন প্রচারের পরে একটি সঠিক হওয়া উচিত ।
আপনি কেবল সংরক্ষণের পরে আইডি পেতে পারেন, পরিবর্তে আপনি একটি নতুন গাইড তৈরি করতে পারেন এবং সংরক্ষণের আগে নির্ধারিত করতে পারেন।
আমি এমন একটি পরিস্থিতি নিয়ে এসেছি যেখানে আমাকে ডাটাবেসে ডেটা inোকানো প্রয়োজন এবং একই সাথে সত্তা ফ্রেমওয়ার্ক ব্যবহার করে প্রাথমিক আইডি প্রয়োজন। সমাধান:
long id;
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null;
try
{
InfoBase = new GenericQueryRepository<myentityclass, Entityname>();
InfoBase.Add(generalinfo);
InfoBase.Context.SaveChanges();
id = entityclassobj.ID;
return id;
}
সমস্ত উত্তরগুলি তাদের নিজস্ব দৃশ্যের জন্য খুব উপযুক্ত;
using (Entities entities = new Entities())
{
int employeeId = entities.Employee.Add(new Employee
{
EmployeeName = employeeComplexModel.EmployeeName,
EmployeeCreatedDate = DateTime.Now,
EmployeeUpdatedDate = DateTime.Now,
EmployeeStatus = true
}).EmployeeId;
//...use id for other work
}
সুতরাং সম্পূর্ণ নতুন অবজেক্ট তৈরির পরিবর্তে, আপনি যা চান কেবল তা গ্রহণ করুন :)
মিঃ @ গার্টআরনল্ডের জন্য সম্পাদনা করুন:
Add(যদি এটি হয় DbSet.Add) যাদুকরীতে কোনও মান নির্ধারণ করে নাEmployeeId ।
SaveChanges। অসম্ভব। আপনার যদি অন্য কোনও প্রক্রিয়া নির্ধারিত EmployeeIdনা হয় তবে উদাহরণস্বরূপ Employeeএর কনস্ট্রাক্টর। অথবা আপনি EF কোর ব্যবহার করছেন ForSqlServerUseSequenceHiLo। যাইহোক, আপনি পুরো ছবি দিচ্ছেন না।
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
এটি কাজ করবে।
Repositoryতা সম্পূর্ণ অস্পষ্ট । এবং "এটি কাজ করবে" এর কিছু ব্যাখ্যা !.
দুটি কৌশল রয়েছে:
ডেটাবেস-উত্পন্ন ID( intবা GUID) ব্যবহার করুন
কনস:
সবেমাত্র সঞ্চিত সত্তাদের জন্য আপনার সম্পাদন SaveChanges()করা উচিত ID।
পেশাদাররা:
intপরিচয় ব্যবহার করতে পারেন ।
উত্পন্ন ক্লায়েন্ট ব্যবহার করুন ID- কেবল জিইউডি।
পেশাদাররা: SaveChangesঅপারেশন মিনিফিকেশন । প্রতি ক্রিয়াকলাপে নতুন অবজেক্টের একটি বড় গ্রাফ toোকাতে সক্ষম।
কনস:
শুধুমাত্র জন্য অনুমোদিত GUID
আপনি যখন EF 6.x কোডটি প্রথমে ব্যবহার করবেন
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
এবং একটি ডাটাবেস টেবিল সূচনা, এটি একটি করা হবে
(newsequentialid())
শিরোনাম ডিফল্ট মান বা বাঁধার অধীনে সারণীর বৈশিষ্ট্যগুলির ভিতরে আইডি asোকানো হিসাবে পপুলেট হতে দেয়।
সমস্যাটি হ'ল যদি আপনি কোনও টেবিল তৈরি করেন এবং এটি যোগ করুন
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
অংশটি পরে, ভবিষ্যতের আপডেট-ডাটাবেসগুলি নতুন (নতুন প্রয়োজনীয়) () যুক্ত করবে না
সঠিক উপায়টি স্থির করার জন্য হ'ল মাইগ্রেশন মুছা, ডাটাবেস মুছে ফেলা এবং পুনরায় স্থানান্তর করা ... বা আপনি কেবল সারণি ডিজাইনারে (newsequentialid ()) যুক্ত করতে পারেন।
when -column- is NULL, then NEWID()