সত্তা ফ্রেমওয়ার্ক থেকে একটি একক রেকর্ড মুছবেন?


195

আমার সত্তা ফ্রেমওয়ার্কে একটি এসকিউএল সার্ভার টেবিল রয়েছে যার নাম দেওয়া employএকটি একক কী কলাম রয়েছে ID

সত্তা ফ্রেমওয়ার্ক ব্যবহার করে কীভাবে আমি টেবিল থেকে একটি একক রেকর্ড মুছব?


2
db.employ.Remove (db.employ.Find (ID1))
কার্টার মেডলিন

2
@ কার্টারমেডলিন - এটি যখন কাজ করবে তখন সেগুলি দুটি ডাটাবেস হিট: একটি নির্বাচন এবং একটি মোছা। বেশিরভাগ লোকেরা এটি অত্যন্ত অপব্যয়যুক্ত বলে মনে করেন, বিশেষত যেহেতু নির্বাচন সম্ভবত মুছার চেয়ে উল্লেখযোগ্যভাবে বেশি সময় নেয়।
Davor

পারফরম্যান্স সমস্যার কারণে আমি সত্তা কাঠামো সরান বা সরানরেজ ব্যবহার করার পরামর্শ দেব না। আমি কেবল নীচের হিসাবে সুপার সাধারণ কিছু ব্যবহার করব: var sql = "আপনার_ফিল্ড যেখানে আপনার_ফিল্ড = @ আপনার_পরিমিটার" থেকে মুছে ফেলুন "; this.your_context.Database.ExecuteSqlCommand (sql, new SQLlParameter ("@ your_parameter", yourParameter)));
কৌতূহলবাই

2
@ কুরিয়াসবয় আমার ধারণা যে আপনি যখন মতামত দিয়েছিলেন তেমন বিবৃতি কার্যকর করেন, EF6 ক্যাশে পরিবর্তনটি প্রতিফলিত করে না।
ইয়েজচাক

উত্তর:


362

প্রথমে অবজেক্টটি জিজ্ঞাসা করার প্রয়োজন নেই, আপনি এটির আইডি দিয়ে প্রসঙ্গে সংযুক্ত করতে পারেন। এটার মত:

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();

87
বিকল্পভাবে,ctx.Entry(employer).State = EntityState.Deleted
সাইমন বেলঞ্জার

12
সম্পর্কগুলি মুছে ফেলা ক্যাসকেড হিসাবে সংজ্ঞায়িত করা হলে এটি কাজ করবে। অন্যথায় উপরের কোডটি এফকে ব্যতিক্রমে ব্যর্থ হবে।
বারুচল

6
@ এমটি_সার্গ, আমি তিন ধাপ এগিয়ে খুঁজছি আপনাকে শেষবার কখন ডিবির কাছ থেকে এত সরল রেকর্ড সরিয়ে ফেলতে হয়েছিল? সাধারণত আপনি আরও জটিল রেকর্ডগুলির সাথে ডিল করেন যা এফকে সম্পর্ক অন্তর্ভুক্ত করে। তাই আমার মন্তব্য।
বারুচল

2
@ ইয়ানবারবার্টন দ্বিতীয় এবং তৃতীয় লাইন (সংযুক্ত করুন এবং সরান)
সাইমন বেলঞ্জার

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

82

আপনি 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();
}

5
এটি ভাল উপায় নয়, কারণ আপনি ডাটাবেস থেকে সমস্ত ক্ষেত্র নির্বাচন করছেন!
আলী ইউসফি

2
এইভাবেই আমি এটি করি।
জ্যাক ফেয়ারফিল্ড

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

4
এই ভাল উপায়। চিন্তা করুন. যদি জন স্মিথ একটি আইডি = 1 দিয়ে কোনও আইটেম সরিয়ে দেওয়ার চেষ্টা করছেন যা সুসি স্মিথ 30 সেকেন্ড আগে সরিয়ে ফেলেছিল তবে জন জানেন না? সেক্ষেত্রে আপনার ডাটাবেস হিট করা দরকার।
Yusha

4
@ ইউশা কেন? উভয় পরিস্থিতিতে ফলাফলটি রেকর্ড হয়ে গেছে। এটি এখন বা 30 সেকেন্ড আগে ঘটেছিল কিনা তা কি আমরা সত্যিই যত্ন করি? কিছু বর্ণের শর্তগুলি কেবল ট্র্যাক রাখা আকর্ষণীয় নয়।
রুন 5

13
  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();

2
FirstOrDefaultবিপদজনক. হয় আপনি জানেন যে কেবলমাত্র একটি (তাই ব্যবহার করুন SingleOrDefault), বা একাধিক রয়েছে এবং এটি একটি লুপে করা উচিত।
মার্ক সোওুল

8
Employer employer = context.Employers.First(x => x.EmployerId == 1);

context.Customers.DeleteObject(employer);
context.SaveChanges();

আইডি 1 এর সাথে কোনও বিষয় না থাকলে এটি কী সুরক্ষা দেয়? এটা কি ব্যতিক্রম ছুঁড়ে না?
জ্যাক ফেয়ারফিল্ড

@ জ্যাকফায়ারফিল্ড আমার মনে হয় আপনার নাল বস্তুর জন্য পরীক্ষা করা উচিত এবং এটি অনুযায়ী অপসারণ সঞ্চালন।
জাওয়ন্দ সিং

Firstবিপদজনক. হয় আপনি জানেন যে কেবলমাত্র একটি (তাই ব্যবহার করুন Single), বা একাধিক রয়েছে এবং এটি একটি লুপে করা উচিত।
মার্ক সোউল

5

আমি লিনকিউ সহ সত্তা কাঠামো ব্যবহার করছি। নিম্নলিখিত কোডটি আমার পক্ষে সহায়ক ছিল;

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?
মার্ক সোওুল

আপনি যখনই সিঙ্গেলঅরডিফল্ট ব্যবহার করেন, আপনি পরিষ্কারভাবে বলেছিলেন যে ক্যোয়ারির সর্বাধিক একক ফলাফল হওয়া উচিত। অন্যদিকে, যখন FirstOrDefault ব্যবহার করা হয়, ক্যোয়ারী ফলাফল যে কোন পরিমাণ আসতে পারেন কিন্তু আপনি রাষ্ট্রীয় যে আপনি শুধুমাত্র প্রথম এক করতে চান stackoverflow.com/a/1745716/3131402
Baqer নাকভি

1
হ্যাঁ, সুতরাং যদি একাধিকটি থাকে তবে একটি স্বেচ্ছাসেবী রেকর্ড মুছে ফেলা কেন সঠিক হবে? বিশেষত এই ক্ষেত্রে আইডিটি মূল কী, তাই এখানে একটি হওয়া উচিত: যদি একের বেশি থাকে তবে এটি একটি বাগ (যা একক সনাক্ত করবে)
মার্ক সোওল

পছন্দ করেছেন আমি ফার্স্টআরডিফল্ট ব্যবহার করার জন্য উত্তরটি সম্পাদনা করেছি।
বাকের নকভি

@ বাকেরনাকভি সরানরেঞ্জ হ'ল পারফরম্যান্সের দৃষ্টিকোণ থেকে সত্তা সরিয়ে ফেলার এক দুর্দান্ত উপায় .. বিশেষত যখন আপনার সত্তা বিদেশী কী দ্বারা সমস্ত নেভিগেশনাল সম্পত্তি সহ ভারী হয়। আমি পরিবর্তে var sql = "আপনার_ফিল্ড যেখানে আপনার_ফিল্ড = @ আপনার_পরিমিটার থেকে মুছে ফেলুন" ব্যবহার করব; this.your_context.Database.ExecuteSqlCommand (sql, new SQLlParameter ("@ your_parameter", yourParameter)));
কৌতূহলবাই

2

আরও জেনেরিক অ্যাপ্রুচ

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);
}

2

সত্তা ফ্রেমওয়ার্ক 6 এর সাথে, আপনি ব্যবহার করতে পারেন Removeusingআপনার সংযোগ বন্ধ রয়েছে তা নিশ্চিত হওয়ার জন্য এটি ব্যবহার করা ভাল কৌশল ।

using (var context = new EmployDbContext())
{
    Employ emp = context.Employ.Where(x => x.Id == id).Single<Employ>();
    context.Employ.Remove(emp);
    context.SaveChanges();
}

1

আমি যে তিনটি পদ্ধতির সাথে পিছনে পিছনে ফিরে এসেছি তা অবদান রাখতে চেয়েছিলাম।

পদ্ধতি 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;

0
    [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();

0

জেনেরিক ডিএওর জন্য আমার কাজটি ফাইনালি করে:

    public void Detele(T entity)
    {
        db.Entry(entity).State = EntityState.Deleted;
        db.SaveChanges();
    }


0

আপনি এটি সহজভাবে এটি করতে পারেন

   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>

আমি আশা করি এটি আপনার পক্ষে বুঝতে সহজ হবে


0

আপনি আপনার গ্রিডের ক্লিক বা সেলডুবলক্লিক ইভেন্টে এটির মতো কিছু করতে পারেন (যদি আপনি এটি ব্যবহার করেন)

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();

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


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

0

এখানে একটি নিরাপদ উপায়:

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...
  }
}

এখানে আপনি যে সমস্ত পরিবর্তন চান তা সজ্জিত করতে পারেন, সুতরাং আপনি সেভচেন্জেস এবং কমিটের আগে মুছে ফেলার একটি সিরিজ করতে পারেন, সুতরাং সেগুলি কেবলমাত্র সফল হলেই প্রয়োগ করা হবে।


0

সেরা উপায় হ'ল চেক এবং তারপরে মুছে ফেলা

        if (ctx.Employ.Any(r=>r.Id == entity.Id))
        {
            Employ rec = new Employ() { Id = entity.Id };
            ctx.Entry(rec).State = EntityState.Deleted;
            ctx.SaveChanges();
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.