সত্তা ফ্রেমওয়ার্ক 4 - অ্যাডবজেক্ট বনাম সংযুক্তি


132

আমি সম্প্রতি সত্ত্বা ফ্রেমওয়ার্ক 4 এর সাথে কাজ করছি এবং অবজেক্টসেট.আটাচ এবং অবজেক্টসেট.এডডবজেক্টটি কখন ব্যবহার করব সে সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি

আমার বোঝার থেকে:

  • সিস্টেমে কোনও সত্তা ইতিমধ্যে উপস্থিত থাকলে "সংযুক্তি" ব্যবহার করুন
  • একটি নতুন সত্তা তৈরি করার সময় "অ্যাডবজেক্ট" ব্যবহার করুন

সুতরাং, যদি আমি একটি নতুন ব্যক্তি তৈরি করি তবে আমি এটি করি ।

var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();

যদি আমি কোনও বিদ্যমান ব্যক্তিকে সংশোধন করি তবে আমি এটি করি :

var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();

মনে রাখবেন, এটি খুব সাধারণ উদাহরণ। বাস্তবে আমি খাঁটি পোকো (কোনও কোড জেনারেশন), সংগ্রহস্থল প্যাটার্ন (ctx.Persons সাথে ডিল করবেন না), এবং ইউনিট অফ ওয়ার্ক (ctx.SaveChanges নিয়ে কাজ করবেন না) ব্যবহার করছি। তবে "প্রচ্ছদের নীচে", উপরেরটি আমার বাস্তবায়নে কী ঘটে।

এখন, আমার প্রশ্ন - আমি এখনও এমন একটি দৃশ্য খুঁজে পাইনি যেখানে আমাকে সংযুক্তি ব্যবহার করতে হয়েছে ।

আমি এখানে কি মিস করছি? আমাদের কখন সংযুক্তি ব্যবহার করা দরকার?

সম্পাদনা

শুধু নির্মল, আমি খুঁজছি উদাহরণ যখন AddObject উপর সংযুক্ত করুন (অথবা বিপরীতভাবে) ব্যবহার করতে।

সম্পাদনা 2

নীচের উত্তরটি সঠিক (যা আমি মেনে নিয়েছি) তবে ভেবেছিলাম যে আমি অন্য একটি উদাহরণ যুক্ত করব যেখানে সংযুক্তি কার্যকর হবে।

বিদ্যমান ব্যক্তিকে সংশোধন করার জন্য আমার উপরের উদাহরণে , দুটি ক্যোয়ারী আসলে কার্যকর করা হচ্ছে।

একজন ব্যক্তি (.SingleOrDefault) পুনরুদ্ধার করার জন্য এবং অন্যটি আপডেট (। সেভচেনজেস) সম্পাদন করার জন্য।

যদি (কোনও কারণে), আমি ইতিমধ্যে জানতাম যে সিস্টেমে "জো ব্লগস" বিদ্যমান আছে, তবে তাকে প্রথমে পাওয়ার জন্য কেন একটি অতিরিক্ত জিজ্ঞাসা করবেন? আমি এটি করতে পারি:

var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();

এর ফলে কেবলমাত্র একটি আপডেটের বিবৃতি কার্যকর করা হবে।


মডেলগুলি সরাসরি ইএফ-এ ফিরিয়ে দেওয়ার সময় এখন এমভিসিতে অ্যাটাচ ব্যবহার করা হয়। বেশ ভাল কাজ করে এবং কোড লাইন একটি টন সংরক্ষণ করে।
পাইওটর কুলা

উত্তর:


162

ObjectContext.AddObject এবং ObjectSet.AddObject : AddObject পদ্ধতি নব নির্মিত যে বস্তু না যোগ করার জন্য হয় না ডাটাবেসের মধ্যে বিদ্যমান। সত্তা একটি স্বয়ংক্রিয়ভাবে উত্পন্ন হওয়া অস্থায়ী পাবেন EntityKey এবং তার EntityState সেট করা হবে যোগ করা হয়েছে । যখন SaveChanges ডাকা হবে, EF- র কাছে এটি স্পষ্ট হবে যে এই সত্তাটি ডাটাবেসে সন্নিবেশ করা দরকার।

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

তদতিরিক্ত, সংযুক্তি পদ্ধতিটি ব্যবহার করে আপনি সত্তার মধ্যে সম্পর্ক নির্ধারণ করতে পারেন যা ইতিমধ্যে অবজেক্ট কনটেক্সটে উপস্থিত রয়েছে তবে রয়েছেনা স্বয়ংক্রিয়ভাবে সংযুক্ত করা হয়েছে। মূলত সংযুক্তির মূল উদ্দেশ্য হ'ল অবজেক্ট কনটেক্সট-এর সাথে ইতিমধ্যে সংযুক্ত এমন সংস্থাগুলি সংযুক্ত করা যাআপনি নতুন নয় যা আপনাকে অ্যান্টিটিস্টেট যুক্ত হওয়া সত্তাগুলি সংযুক্ত করার জন্য সংযুক্তি ব্যবহার করতে পারবেন না। এই ক্ষেত্রেআপনাকে অ্যাড () ব্যবহার করতে হবে।

উদাহরণস্বরূপ, ধরে নেওয়া যাক আপনার ব্যক্তি সত্তার ঠিকানাগুলি নামে একটি নেভিগেশন সম্পত্তি রয়েছেযা ঠিকানা সত্তারসংগ্রহ। ধরা যাক আপনি উভয় অবজেক্টটি প্রসঙ্গ থেকে পড়েছেন তবে তারা একে অপরের সাথে সম্পর্কিত নয় এবং আপনি এটি তৈরি করতে চান:

var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
var myAddress = ctx.Addresses.First(a => a.PersonID != existingPerson.PersonID);
existingPerson.Addresses.Attach(myAddress);
// OR:
myAddress.PersonReference.Attach(existingPerson)
ctx.SaveChanges();

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

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

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

1
গ্রেট। আমি কি আপনাকে জিজ্ঞাসা করতে পারি যে এই পোস্টটি পড়তে পারে এমন অন্যান্য সহ বিকাশকারীদের জন্য ভিডিওর লিঙ্কটি ভাগ করে নিতে?
মরতেজা মানাভি

3
আরপিএম 1984 দ্বারা ভাগ করা উপরের লিঙ্কটি ভাঙা হয়েছে, এটি এখন চ্যানেল 9.msdn.com/Events/TechEd/NorthAmerica/2010/DEV205 এ পুনঃনির্দেশিত হয়েছে । উপভোগ করুন
সারিবদ্ধ

31

এটি দেরি করে দেওয়া প্রতিক্রিয়া তবে এটি অন্যকে এটির পক্ষে সহায়তা করতে পারে।

মূলত, "সংযোগযুক্ত" সত্তাটি ঘটতে পারে যখন আপনি "ব্যবহার" সুযোগের বাইরে কোনও সত্তাকে কারসাজি করেন।

Employee e = null;

using (var ctx = new MyModelContainer())
{
     e = ctx.Employees.SingleOrDefault(emp => emp .....);
}

using (var ctx2 = new MyModelContainer())
{
     e; // This entity instance is disconnected from ctx2
}

যদি আপনি অন্য "ব্যবহার করে" স্কোপ প্রবেশ করেন তবে "ই" ভেরিয়েবলটি সংযোগ বিচ্ছিন্ন হয়ে যাবে কারণ এটি পূর্ববর্তী "ব্যবহার" স্কোপের সাথে সম্পর্কিত এবং যেহেতু পূর্ববর্তী "ব্যবহার" স্কোপটি নষ্ট হয়ে যায় তখন "ই" সংযোগ বিচ্ছিন্ন হয়ে যায়।

আমি এটি বুঝতে পারি।


3
টিচির উদাহরণটি একটি দুর্দান্ত এবং সাধারণ উদাহরণ - হ্যাঁ, কর্মচারী ভেরিয়েবলটি বাইরে ঘোষণা করা উচিত। সুযোগের বাইরে e.Adress.Street চেষ্টা করুন এবং একটি শূন্য রেফারেন্স ব্যতিক্রম পপ-আপ দেখুন see আপনি যদি সংযুক্ত হন তবে আবেদনটি দ্বিতীয় সুযোগে কর্মচারীর জন্য ডিবিতে ফিরে যেতে হবে না।
স্টিভ

9

এটি প্রোগ্রামিং সত্তা ফ্রেমওয়ার্কের একটি উদ্ধৃতি : ডিবি কনটেক্সট

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

private static void TestDeleteDestination()
{
    Destination canyon;
    using (var context = new BreakAwayContext())
    {
        canyon = (from d in context.Destinations
        where d.Name == "Grand Canyon"
        select d).Single();
    }
    DeleteDestination(canyon);
}
private static void DeleteDestination(Destination destination)
{
    using (var context = new BreakAwayContext())
    {
        context.Destinations.Attach(destination);
        context.Destinations.Remove(destination);
        context.SaveChanges();
    }
}

টেস্টডিলেটডেস্টিনেশন পদ্ধতিটি কোনও ক্লায়েন্ট অ্যাপ্লিকেশনকে সার্ভার থেকে একটি বিদ্যমান গন্তব্য আনতে এবং তারপরে এটি সার্ভারের মুছে ফেলা পদ্ধতিতে পাস করার অনুকরণ করে। মুছে ফেলা পদ্ধতিটি প্রসঙ্গটি জানতে দেয় যে এটি একটি বিদ্যমান গন্তব্য। তারপরে সরান পদ্ধতিটি মুছে ফেলার জন্য বিদ্যমান গন্তব্যটি নিবন্ধকরণ করতে ব্যবহৃত হয়


-8

সংযুক্তি পরিবর্তে কেবল প্রাথমিক কীটি উল্লেখ করার বিষয়ে কী?

অর্থাৎ,

var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
var myAddress = ctx.Addresses.First(a => a.PersonID != existingPerson.PersonID);
existingPerson.AddressId = myAddress.Id // not -> existingPerson.Addresses.Attach(myAddress);
// OR:
myAddress.Person.Id = existingPerson.Id // not -> myAddress.PersonReference.Attach(existingPerson);
ctx.SaveChanges();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.