আমার সত্তা ফ্রেমওয়ার্কে একটি এসকিউএল সার্ভার টেবিল রয়েছে যার নাম দেওয়া employ
একটি একক কী কলাম রয়েছে ID
।
সত্তা ফ্রেমওয়ার্ক ব্যবহার করে কীভাবে আমি টেবিল থেকে একটি একক রেকর্ড মুছব?
আমার সত্তা ফ্রেমওয়ার্কে একটি এসকিউএল সার্ভার টেবিল রয়েছে যার নাম দেওয়া employ
একটি একক কী কলাম রয়েছে ID
।
সত্তা ফ্রেমওয়ার্ক ব্যবহার করে কীভাবে আমি টেবিল থেকে একটি একক রেকর্ড মুছব?
উত্তর:
প্রথমে অবজেক্টটি জিজ্ঞাসা করার প্রয়োজন নেই, আপনি এটির আইডি দিয়ে প্রসঙ্গে সংযুক্ত করতে পারেন। এটার মত:
var employer = new Employ { Id = 1 };
ctx.Employ.Attach(employer);
ctx.Employ.Remove(employer);
ctx.SaveChanges();
বিকল্পভাবে, আপনি মুছে ফেলাতে সংযুক্ত প্রবেশের স্থিতি সেট করতে পারেন:
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(employer).State = EntityState.Deleted
আপনি SingleOrDefault
আপনার মানদণ্ডের সাথে মিলে একটি একক জিনিস পেতে ব্যবহার করতে পারেন এবং তারপরে Remove
এটি আপনার EF টেবিলের পদ্ধতিতে প্রেরণ করুন ।
var itemToRemove = Context.Employ.SingleOrDefault(x => x.id == 1); //returns a single item.
if (itemToRemove != null) {
Context.Employ.Remove(itemToRemove);
Context.SaveChanges();
}
var stud = (from s1 in entities.Students
where s1.ID== student.ID
select s1).SingleOrDefault();
//Delete it from memory
entities.DeleteObject(stud);
//Save to database
entities.SaveChanges();
FirstOrDefault
বিপদজনক. হয় আপনি জানেন যে কেবলমাত্র একটি (তাই ব্যবহার করুন SingleOrDefault
), বা একাধিক রয়েছে এবং এটি একটি লুপে করা উচিত।
Employer employer = context.Employers.First(x => x.EmployerId == 1);
context.Customers.DeleteObject(employer);
context.SaveChanges();
First
বিপদজনক. হয় আপনি জানেন যে কেবলমাত্র একটি (তাই ব্যবহার করুন Single
), বা একাধিক রয়েছে এবং এটি একটি লুপে করা উচিত।
আমি লিনকিউ সহ সত্তা কাঠামো ব্যবহার করছি। নিম্নলিখিত কোডটি আমার পক্ষে সহায়ক ছিল;
1- একাধিক রেকর্ডের জন্য
using (var dbContext = new Chat_ServerEntities())
{
var allRec= dbContext.myEntities;
dbContext.myEntities.RemoveRange(allRec);
dbContext.SaveChanges();
}
2- একক রেকর্ডের জন্য
using (var dbContext = new Chat_ServerEntities())
{
var singleRec = dbContext.ChatUserConnections.FirstOrDefault( x => x.ID ==1);// object your want to delete
dbContext.ChatUserConnections.Remove(singleRec);
dbContext.SaveChanges();
}
SingleOrDefault
না করে FirstOrDefault
?
আরও জেনেরিক অ্যাপ্রুচ
public virtual void Delete<T>(int id) where T : BaseEntity, new()
{
T instance = Activator.CreateInstance<T>();
instance.Id = id;
if (dbContext.Entry<T>(entity).State == EntityState.Detached)
{
dbContext.Set<T>().Attach(entity);
}
dbContext.Set<T>().Remove(entity);
}
সত্তা ফ্রেমওয়ার্ক 6 এর সাথে, আপনি ব্যবহার করতে পারেন Remove
। using
আপনার সংযোগ বন্ধ রয়েছে তা নিশ্চিত হওয়ার জন্য এটি ব্যবহার করা ভাল কৌশল ।
using (var context = new EmployDbContext())
{
Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
context.Employ.Remove(emp);
context.SaveChanges();
}
আমি যে তিনটি পদ্ধতির সাথে পিছনে পিছনে ফিরে এসেছি তা অবদান রাখতে চেয়েছিলাম।
পদ্ধতি 1:
var record = ctx.Records.FirstOrDefault();
ctx.Records.Remove(record);
ctx.SaveChanges();
পদ্ধতি 2:
var record = ctx.Records.FirstOfDefault();
ctx.Entry(record).State = EntityState.Deleted;
ctx.SaveChanges();
ctx.Entry(record).State = EntityState.Detached;
আমি পদ্ধতি 2 এর সাথে কেন যেতে পছন্দ করি তার একটি কারণ হ'ল EF বা EFCore সেট করার ক্ষেত্রেQueryTrackingBehavior.NoTracking
এটি করা আরও নিরাপদ
তারপরে 3 পদ্ধতি রয়েছে:
var record = ctx.Records.FirstOrDefault();
var entry = ctx.Entry(record);
record.DeletedOn = DateTimeOffset.Now;
entry.State = EntityState.Modified;
ctx.SaveChanges();
entry.State = EntityState.Detached;
এটি রেকর্ডের DeletedOn
সম্পত্তি সেট করে নরম মোছার পদ্ধতিকে ব্যবহার করে এবং এখনও ভবিষ্যতে ব্যবহারের জন্য রেকর্ড রাখতে সক্ষম হয়, যা সে হতে পারে। মূলত, এটি রিসাইকেল বিনে রাখা ।
এছাড়াও, পদ্ধতি 3 এর ক্ষেত্রে , পুরো রেকর্ডটি পরিবর্তনের পরিবর্তে সেট করার পরিবর্তে:
entry.State = EntityState.Modified;
আপনি কেবলমাত্র কলামটি DeletedOn
পরিবর্তিত হিসাবে সেট করতে পারবেন :
entry.Property(x => x.DeletedOn).IsModified = true;
[HttpPost]
public JsonResult DeleteCotnact(int id)
{
using (MycasedbEntities dbde = new MycasedbEntities())
{
Contact rowcontact = (from c in dbde.Contact
where c.Id == id
select c).FirstOrDefault();
dbde.Contact.Remove(rowcontact);
dbde.SaveChanges();
return Json(id);
}
}
আপনি এটিকে কী সহজ, না কি মনে করেন, আপনি এটিও চেষ্টা করতে পারেন:
var productrow = cnn.Product.Find(id);
cnn.Product.Remove(productrow);
cnn.SaveChanges();
জেনেরিক ডিএওর জন্য আমার কাজটি ফাইনালি করে:
public void Detele(T entity)
{
db.Entry(entity).State = EntityState.Deleted;
db.SaveChanges();
}
অ্যান্টিটি ফ্রেমওয়ার্ক.প্লাস ব্যবহার করা একটি বিকল্প হতে পারে:
dbContext.Employ.Where(e => e.Id == 1).Delete();
আরও উদাহরণ এখানে পাওয়া যায়
আপনি এটি সহজভাবে এটি করতে পারেন
public ActionResult Delete(int? id)
{
using (var db = new RegistrationEntities())
{
Models.RegisterTable Obj = new Models.RegisterTable();
Registration.DAL.RegisterDbTable personalDetail = db.RegisterDbTable.Find(id);
if (personalDetail == null)
{
return HttpNotFound();
}
else
{
Obj.UserID = personalDetail.UserID;
Obj.FirstName = personalDetail.FName;
Obj.LastName = personalDetail.LName;
Obj.City = personalDetail.City;
}
return View(Obj);
}
}
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int? id)
{
using (var db = new RegistrationEntities())
{
Registration.DAL.RegisterDbTable personalDetail = db.RegisterDbTable.Find(id);
db.RegisterDbTable.Remove(personalDetail);
db.SaveChanges();
return RedirectToAction("where u want it to redirect");
}
}
মডেল
public class RegisterTable
{
public int UserID
{ get; set; }
public string FirstName
{ get; set; }
public string LastName
{ get; set; }
public string Password
{ get; set; }
public string City
{ get; set; }
}
আপনি যা থেকে কল করবেন তা দেখুন
<table class="table">
<tr>
<th>
FirstName
</th>
<th>
LastName
</th>
<th>
City
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td> @item.FirstName </td>
<td> @item.LastName </td>
<td> @item.City</td>
<td>
<a href="@Url.Action("Edit", "Registeration", new { id = item.UserID })">Edit</a> |
<a href="@Url.Action("Details", "Registeration", new { id = item.UserID })">Details</a> |
<a href="@Url.Action("Delete", "Registeration", new { id = item.UserID })">Delete</a>
</td>
</tr>
}
</table>
আমি আশা করি এটি আপনার পক্ষে বুঝতে সহজ হবে
আপনি আপনার গ্রিডের ক্লিক বা সেলডুবলক্লিক ইভেন্টে এটির মতো কিছু করতে পারেন (যদি আপনি এটি ব্যবহার করেন)
if(dgEmp.CurrentRow.Index != -1)
{
employ.Id = (Int32)dgEmp.CurrentRow.Cells["Id"].Value;
//Some other stuff here
}
তারপরে আপনার মুছুন বোতামটিতে এমন কিছু করুন:
using(Context context = new Context())
{
var entry = context.Entry(employ);
if(entry.State == EntityState.Detached)
{
//Attached it since the record is already being tracked
context.Employee.Attach(employ);
}
//Use Remove method to remove it virtually from the memory
context.Employee.Remove(employ);
//Finally, execute SaveChanges method to finalized the delete command
//to the actual table
context.SaveChanges();
//Some stuff here
}
বিকল্পভাবে, আপনি লিনকিউ টু সত্তা কোয়েরি ব্যবহার না করে একটি লিনকিউ ক্যোয়ারি ব্যবহার করতে পারেন:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
এমপ্লয়.আইডি ফিল্টারিং প্যারামিটার হিসাবে ব্যবহৃত হয় যা ইতিমধ্যে আপনার ডেটাগ্রিডভিউয়ের সেলডুবলক্লিক ইভেন্ট থেকে পাস করা হয়েছিল।
এখানে একটি নিরাপদ উপায়:
using (var transitron = ctx.Database.BeginTransaction())
{
try
{
var employer = new Employ { Id = 1 };
ctx.Entry(employer).State = EntityState.Deleted;
ctx.SaveChanges();
transitron.Commit();
}
catch (Exception ex)
{
transitron.Rollback();
//capture exception like: entity does not exist, Id property does not exist, etc...
}
}
এখানে আপনি যে সমস্ত পরিবর্তন চান তা সজ্জিত করতে পারেন, সুতরাং আপনি সেভচেন্জেস এবং কমিটের আগে মুছে ফেলার একটি সিরিজ করতে পারেন, সুতরাং সেগুলি কেবলমাত্র সফল হলেই প্রয়োগ করা হবে।