সত্তা ফ্রেমওয়ার্ক সহ আইডি দ্বারা কোনও বস্তু কীভাবে মুছবেন


110

আমার কাছে মনে হয় নিচের মতো সত্তা ফ্রেমওয়ার্কের সাহায্যে কোনও জিনিস মুছে ফেলার আগে আমাকে পুনরুদ্ধার করতে হবে

var customer = context.Customers.First(c => c.Id == 1);

context.DeleteObject(customer);

context.Savechanges();

সুতরাং আমি দুইবার ডাটাবেস হিট করা প্রয়োজন। কোন সহজ উপায় আছে?


j.mp/f0x0Bh আপনার উত্তর। এটি করার একটি দুর্দান্ত এবং জেনেরিক উপায়
ব্রিটিশ ডেভেলপার

উত্তর:


104

সত্তা ফ্রেমওয়ার্ক 6 এ মুছে ফেলা কর্মটি Remove। এখানে একটি উদাহরণ

Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();

17
কেন Attach? শুধু Removeএবং কেন নয় SaveChanges?
রানেক

4
আপনাকে প্রসঙ্গটিতে আপনার সত্তা সংযুক্ত করতে হবে কারণ আপনি যদি এটি না করেন তবে অপসারণ করার সময় আপনি একটি ত্রুটি পাবেন। ইএফ কেবল এই প্রসঙ্গে সত্তাগুলি সরিয়ে ফেলতে পারে
পিয়ের-লুক

4
@ অপারেশন সঞ্চালনের আগে ম্যানুয়াল অনুসারে সুনির্দিষ্ট সত্তা অবশ্যই প্রসঙ্গে থাকতে হবে। এখানে ডকস.মাইক্রোসফট.এইন
ইউএস /

4
আমি সংযুক্তিটি ব্যবহার করি নি, এবং এটি জরিমানা
জাগে

58

দৃN়ভাবে টাইপ করার জন্য একটি ছোট পরিবর্তন সহ @ নিক্সের মতো:

আপনি যদি এটির জন্য জিজ্ঞাসা করতে না চান তবে কেবল একটি সত্তা তৈরি করুন, এবং তারপরে এটি মুছুন।

                Customer customer = new Customer () { Id = id };
                context.Customers.Attach(customer);
                context.Customers.DeleteObject(customer);
                context.SaveChanges();

7
অবজেক্টটি অনুপস্থিত থাকলে এটি একটি ব্যতিক্রম ছুঁড়ে নিখুঁত নয়: "DbUpdateConcurrencyException: স্টোর আপডেট, সন্নিবেশ করানো বা বিবৃতি মুছে ফেলা অপ্রত্যাশিত সংখ্যক সারিগুলিকে (0) প্রভাবিত করেছে।" আমি এটি এটিকে উপেক্ষা করতে চাই, যেমন একটি মোছার বিবৃতি চাই।
ডানক

দুঃখিত, এটি বৈধতার কারণ হয়ে থাকে যা সর্বদা প্রয়োজন হয় না এবং প্রত্যাশিত হয়!
হামেদ জাকারি মিয়াব

33

অনুরূপ প্রশ্ন এখানে

সত্তা ফ্রেমওয়ার্কের সাথে রয়েছে এনটিটি ফ্রেমওয়ার্ক -প্লাস (এক্সটেনশন লাইব্রেরি)।
নুগেটে উপলভ্য। তারপরে আপনি এমন কিছু লিখতে পারেন:

// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
     .Delete();

এটি বাল্ক মোছার জন্যও দরকারী।


39
এটি এতক্ষণে এটি মূল ইএফ লাইব্রেরির অংশ না হওয়ার কারণটিকে অস্বীকার করে।
নাথানছের

4
@ ফেরেটাল্লিকা - সম্মত হয়েছে।
অ্যাকারলন

4
এই পদ্ধতিটি অপ্রচলিত ব্যবহার: প্রসঙ্গ U ব্যবহারকারীরা কোথায় আছে (ব্যবহারকারী => ব্যবহারকারীর আইডি == আইডি) D মুছে ফেলুন ();
ম্যানুয়েল

ত্রুটির কারণে এটি আজুর এসকিউএল ডেটাওয়্যারহাউসটির সাথে কাজ করে না "বর্তমানে একটি মোছা বিবৃতিতে একটি এফআরএম ক্লজ সমর্থিত নয়।" কিন্তু জোনিকের উত্তর হিসাবে কাঁচা এসকিউএল কাজ করে।
মাইকেল ফ্রেইজিম

4
কনটেক্সট.সেভ চেঞ্জস () দরকার?
টমাস কুবেস

23

আপনি যদি এটির জন্য জিজ্ঞাসা করতে না চান তবে কেবল একটি সত্তা তৈরি করুন, এবং তারপরে এটি মুছুন।

Customer customer  = new Customer() {  Id = 1   } ; 
context.AttachTo("Customers", customer);
context.DeleteObject(customer);
context.Savechanges();

6

আমি আমার একটি প্রকল্পে নিম্নলিখিত কোডটি ব্যবহার করছি:

    using (var _context = new DBContext(new DbContextOptions<DBContext>()))
    {
        try
        {
            _context.MyItems.Remove(new MyItem() { MyItemId = id });
            await _context.SaveChangesAsync();
        }
        catch (Exception ex)
        {
            if (!_context.MyItems.Any(i => i.MyItemId == id))
            {
                return NotFound();
            }
            else
            {
                throw ex;
            }
        }
    }

এইভাবে, এটি ডাটাবেসটিকে দ্বিগুণ জিজ্ঞাসা করবে কেবলমাত্র যদি নির্দিষ্ট আইডির সাহায্যে আইটেমটি সরিয়ে দেওয়ার চেষ্টা করা হয় যখন ব্যতিক্রম ঘটে। তারপরে যদি আইটেমটি না পাওয়া যায় তবে এটি অর্থবহ বার্তা দেয়; অন্যথায়, এটি কেবল ব্যতিক্রমটিকে ছুঁড়ে ফেলেছে (আপনি বিভিন্ন ব্যতিক্রম ধরণের জন্য বিভিন্ন ক্যাচ ব্লক ব্যবহার করে আপনার ক্ষেত্রে এটি আরও উপযুক্তভাবে পরিচালনা করতে পারেন, ব্লক ইত্যাদি ব্যবহার করে আরও কাস্টম চেক যুক্ত করুন)।

[আমি এই কোডটি একটি এমভিসি। নেট কোর /। নেট কোর প্রকল্পে সত্ত্বা ফ্রেমওয়ার্ক কোর সহ ব্যবহার করছি]]


2

কাঁচা এসকিএল কোয়েরিটি আমার মনে হয় দ্রুততম

public void DeleteCustomer(int id)
{
   using (var context = new Context())
   {
      const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}";
      var rows = context.Database.ExecuteSqlCommand(query,id);
      // rows >= 1 - count of deleted rows,
      // rows = 0 - nothing to delete.
   }
}

19
এটি EF- তে দৃ strongly়ভাবে টাইপ করা অবজেক্ট ফান্টিশালিটি ব্যবহারের উদ্দেশ্যকে পরাস্ত করে।
LawMan

4
এটি EF পরিচয় নগদ নিয়ে আপস করে। এই EF এর পরেও আপনার মুছে ফেলা সত্তা আপনাকে ফিরিয়ে দেবে।
epox

4
এটি অ্যাজুরে এসকিউএল ডেটাওয়্যারহাউস নিয়ে কাজ করে, যখন অন্য সমাধানগুলি না করে।
মাইকেল ফ্রেইজিম

4
আপনি যদি এটি করছেন, আপনি পাশাপাশি কোনও ওআরএম ব্যবহার নাও করতে পারেন। আমি ভাবছি যে এটি EF ক্যাশে আপোস করবে।
ঝড় মুলার 11

এই স্টাইলটি এসকিউএল ইনজেকশন আক্রমণে ঝুঁকিপূর্ণ। এই নির্দিষ্ট উদাহরণে আপনি সুরক্ষিত কারণ ভেরিয়েবলটি একটি পূর্ণসংখ্যা, তবে স্ট্রিং ভেরিয়েবলের সাথে এই প্যাটার্নটি কখনও ব্যবহার করবেন না।
থেলেম

2

dwkd- র উত্তরটি বেশিরভাগ ক্ষেত্রে আমার জন্য সত্ত্বা ফ্রেমওয়ার্ক কোরে কাজ করেছিল, যখন আমি এই ব্যতিক্রমটি দেখতাম তখন বাদে:

অবৈধ অপারেশন এক্সসেপশন: সত্তা টাইপের 'গ্রাহক' উদাহরণটি ট্র্যাক করা যায়নি কারণ {'আইডি' for এর জন্য একই মূল মান সহ অন্য একটি উদাহরণ ইতিমধ্যে ট্র্যাক করা হয়েছে। বিদ্যমান সত্তাগুলি সংযুক্ত করার সময়, নিশ্চিত হওয়া যে প্রদত্ত মূল মান সহ কেবল একটি সত্তা উদাহরণ সংযুক্ত রয়েছে। বিবাদী মূল মানগুলি দেখতে 'DbContextOptionsBuilder.Eableable SensitiveDataLogging' ব্যবহার বিবেচনা করুন।

ব্যতিক্রম এড়াতে, আমি কোডটি আপডেট করেছি:

Customer customer = context.Customers.Local.First(c => c.Id == id);
if (customer == null) {
    customer = new Customer () { Id = id };
    context.Customers.Attach(customer);
}
context.Customers.Remove(customer);
context.SaveChanges();

2

একটি ছোট সংস্করণ (যখন আগের সংস্করণের তুলনায়):

var customer = context.Find(id);
context.Delete(customer);
context.SaveChanges();

দয়া করে এই কোড স্নিপেটে কিছু প্রসঙ্গ সরবরাহ করুন এবং সম্ভবত এটি বিগত দশকের বাকী অন্যান্য উত্তরগুলির চেয়ে ভাল কি করে তার কিছু ব্যাখ্যা।
miken32

2

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

        var object = context.collection.Find(id);  
        context.collection.Remove(object);
        context.SaveChanges();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.