मेरे पास एंटिटी फ्रेमवर्क में एक SQL सर्वर टेबल है जिसका नाम employएकल कुंजी कॉलम है ID।
मैं एंटिटी फ्रेमवर्क का उपयोग करके तालिका से एक एकल रिकॉर्ड कैसे हटा सकता हूं?
मेरे पास एंटिटी फ्रेमवर्क में एक SQL सर्वर टेबल है जिसका नाम 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अपने ईएफ तालिका की विधि में पास कर सकते हैं।
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), या एक से अधिक है, और यह एक लूप में किया जाना चाहिए।
मैं LINQ के साथ एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं। निम्नलिखित कोड मेरे लिए सहायक था;
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?
अधिक सामान्य approuch
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 के साथ जाने का एक कारण यह है कि ईएफ या ईएफसीओआर सेट करने के मामले में 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();
}
EntityFramework.Plus का उपयोग करना एक विकल्प हो सकता है:
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
}
वैकल्पिक रूप से, आप LINQ To Entities Query का उपयोग करने के बजाय एक LINQ क्वेरी का उपयोग कर सकते हैं:
var query = (from emp in db.Employee
where emp.Id == employ.Id
select emp).Single();
Employment.Id का उपयोग फ़िल्टरिंग पैरामीटर के रूप में किया जाता है जो पहले ही आपके DataGridView के CellDoubleClick इवेंट से पास हो गया था।
यहाँ एक सुरक्षित तरीका है:
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...
}
}
यहां आप अपने इच्छित सभी परिवर्तनों को ढेर कर सकते हैं, इसलिए आप SaveChanges और प्रतिबद्ध से पहले विलोपन की एक श्रृंखला कर सकते हैं, इसलिए उन्हें केवल तभी लागू किया जाएगा जब वे सभी सफल होंगे।