সত্তা ফ্রেমওয়ার্ক। সরান () বনাম। ডিলিটঅবজেক্ট ()


141

নিম্নলিখিত দুটি পদ্ধতি ব্যবহার করে আপনি EF ব্যবহার করে একটি ডাটাবেস থেকে কোনও আইটেম সরাতে পারেন।

প্রথমটি EntityCollectionদ্বিতীয়টিতে এবং দ্বিতীয়টি ObjectContext

প্রত্যেকটি কখন ব্যবহার করা উচিত?

একজনের কি অন্যের চেয়ে বেশি পছন্দ?

Remove()a boolএবং DeleteObject()ফেরত দেয় void

উত্তর:


275

এটি সাধারণত সঠিক নয় যে আপনি উভয় পদ্ধতিতে " একটি ডাটাবেস থেকে কোনও আইটেম অপসারণ " করতে পারেন । সুনির্দিষ্টভাবে বলতে গেলে এটি এর মতো:

  • ObjectContext.DeleteObject(entity)প্রসঙ্গ হিসাবে সত্তাDeleted চিহ্নিত । (এটা EntityStateহল Deletedযে পরে।) যদি আপনি কল SaveChangesপরে মতিন একটি এসকিউএল পাঠায় DELETEডাটাবেসের সাথে বিবৃতি। ডাটাবেসে কোনও রেফারেন্সিয়াল সীমাবদ্ধতা লঙ্ঘন না করা সত্তা মুছে ফেলা হবে, অন্যথায় একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

  • EntityCollection.Remove(childEntity)পিতামাতার এবং childEntityহিসাবে সম্পর্কDeleted চিহ্নিত করে । যদি childEntityডাটাবেস থেকে নিজেই মুছে ফেলা হয় এবং আপনি যখন কল করবেন তখন ঠিক কী ঘটে তা SaveChangesনির্ভর করে উভয়ের মধ্যে সম্পর্কের ধরণের উপর:

    • যদি সম্পর্কটি is চ্ছিক হয় , অর্থাত্ বিদেশী চাবি যা শিশু থেকে পিতামাতাকে ডেটাবেজে NULLমান বোঝায় , এই বিদেশীটি বাতিল হয়ে যাবে এবং আপনি যদি SaveChangesএই NULLমানটির জন্য childEntityডাটাবেজে লিখিত হন (যেমন মধ্যে সম্পর্ক দুটি অপসারণ করা হয়)। এটি একটি এসকিউএল UPDATEস্টেটমেন্টের সাথে ঘটে । কোন DELETEবিবৃতি ঘটে না।

    • যদি সম্পর্কের প্রয়োজন হয় (এফকে NULLমানগুলি অনুমোদন দেয় না ) এবং সম্পর্কটি সনাক্ত না করে (যার অর্থ বিদেশী কী বাচ্চার (যৌগিক) প্রাথমিক কীটির অংশ নয়) আপনাকে বাচ্চাকে অন্য পিতামাতার সাথে যুক্ত করতে হবে বা আপনাকে স্পষ্টতই শিশুটিকে মুছতে হবে (তার সাথে সাথে DeleteObject)। আপনি যদি এর মধ্যে কোনও কিছুই না করেন তবে একটি রেফারেন্সিয়াল সীমাবদ্ধতা লঙ্ঘন করা হয় এবং আপনি যখন ফোন করবেন তখন EF একটি ব্যতিক্রম ছুঁড়ে ফেলবে SaveChanges- কুখ্যাত " সম্পর্কটি পরিবর্তন করা যায়নি কারণ এক বা একাধিক বিদেশী-মূল বৈশিষ্ট্য অযোগ্য " ব্যতিক্রম বা অনুরূপ.

    • যদি সম্পর্ক হয় চিহ্নিতকরণের (এটা অগত্যা এর প্রয়োজনীয় তারপর কারণ প্রাথমিক কী কোন অংশ হতে পারে না NULL) মতিন চিহ্নিত হবে childEntityযেমন Deletedপাশাপাশি। আপনি যদি SaveChangesকোনও এসকিউএল কল DELETEকরেন তবে ডেটাবেসে প্রেরণ করা হবে। ডাটাবেসটিতে অন্য কোনও রেফারেন্সিয়াল সীমাবদ্ধতা লঙ্ঘন না করা সত্তা মুছে ফেলা হবে, অন্যথায় একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

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


2
রেফারেন্সিয়াল ইন্টিগ্রিটি উইকিপিডিয়া: রেফারেনশিয়াল অখণ্ডতা হ'ল ডেটার একটি সম্পত্তি যা সন্তুষ্ট হয়ে গেলে, কোনও সম্পর্কের (টেবিল) প্রতিটি বৈশিষ্ট্যের (কলাম) প্রতিটি মানেরই আলাদা (বা একই) সম্পর্কের (টেবিল) এর অন্য বৈশিষ্ট্যের মান হিসাবে উপস্থিত হতে হয় ), সুতরাং যখন সম্পর্ক
মোহাম্মদরেজা

3
@ মোহাম্মদরেজা: আপনি যদি NULL"মান হিসাবে নয়" হিসাবে ব্যাখ্যা করেন ("মানটি" ​​পরিবর্তে NULLআমি মাঝে মাঝে কিছুটা খালি লিখেছি) তবে একটি " alচ্ছিক সম্পর্ক" রেফারেন্সিয়াল অখণ্ডতার সংজ্ঞাটির সাথে বিরোধী নয়।
স্লুমা

1
তাহলে EF কোর সংস্করণটি ObjectContext.DeleteObjectকী?
জোনাথন অ্যালেন

13

আপনি যদি সত্যিই মুছে ফেলা ব্যবহার করতে চান তবে আপনাকে আপনার বিদেশী কীগুলি অবিস্মরণীয় করতে হবে, তবে তারপরে আপনি অনাথ রেকর্ডগুলি শেষ করতে চান (এটির প্রধান কারণগুলির মধ্যে একটি যা আপনাকে প্রথম স্থানে না করা উচিত)। সুতরাং শুধু ব্যবহারRemove()

অবজেক্টকন্টেক্সট.ডিলিটঅবজেক্ট (সত্তা) সত্তাকে প্রসঙ্গে মুছে ফেলা হিসাবে চিহ্নিত করে। (এটির পরে এটিটিস্টেটটি মুছে ফেলা হয়েছে।) আপনি যদি সেভচেন্জেসকে কল করেন তবে EF ডাটাবেসে একটি এসকিউএল মোছার বিবৃতি প্রেরণ করে। ডাটাবেসে কোনও রেফারেন্সিয়াল সীমাবদ্ধতা লঙ্ঘন না করা সত্তা মুছে ফেলা হবে, অন্যথায় একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে।

সত্তা সংগ্রহ: সরানো (চাইল্ড এন্টিটি) মুছে ফেলা হিসাবে পিতামাতা এবং চাইল্ডএন্টির মধ্যে সম্পর্ক চিহ্নিত করে। চাইল্ড এন্টিটি নিজেই ডাটাবেস থেকে মুছে ফেলা হয় এবং যখন আপনি সেভচেন্জেস কল করেন তখন ঠিক কী ঘটে তা দুজনের মধ্যে সম্পর্কের ধরণের উপর নির্ভর করে:

লক্ষণীয় একটি বিষয় হ'ল সেটিংসটি .State = EntityState.Deleted স্বয়ংক্রিয়ভাবে চিহ্নিত পরিবর্তনটিকে ট্রিগার করে না। ( সংরক্ষণাগার )


4
ঠিক আছে, যারা আমার উত্তরটি নিচে ভোট দিয়েছিলেন তাদের স্লুমার সাথে এর কোনও যোগসূত্র নেই - তারা উভয়ই একই ডকুমেন্টেশনের দিকে ইঙ্গিত করে । খনি বাস্তব জীবনের উদাহরণগুলি ব্যাখ্যা করে যখন তার তত্ত্বটি এটির একটি অংশ।
মাতাস ভাইটকেভিসিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.