কোড প্রথম: স্বতন্ত্র সমিতি বনাম বিদেশী কী সমিতি?


102

আমি যখনই কোনও নতুন প্রকল্পে কাজ শুরু করি তখনই আমার নিজের সাথে মানসিক বিতর্ক হয় এবং আমি আমার পোকো ডিজাইন করি। আমি অনেক টিউটোরিয়াল / কোড নমুনাগুলি দেখেছি যা বিদেশী কী সংস্থাগুলির পক্ষে রয়েছে বলে মনে হয় :

বিদেশী কী সমিতি

public class Order
{
    public int ID { get; set; }
    public int CustomerID { get; set; } // <-- Customer ID
    ...
}

স্বাধীন সমিতিগুলির বিরোধিতা হিসাবে :

স্বতন্ত্র সমিতি

public class Order
{
    public int ID { get; set; }
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

আমি অতীতে NHibernate এর সাথে কাজ করেছি এবং স্বতন্ত্র সমিতিগুলি ব্যবহার করেছি যা কেবলমাত্র OO বোধ করে না, তবে (অলস লোডিং সহ) আমাকে কেবল তার আইডি না দিয়ে পুরো গ্রাহক অবজেক্টে অ্যাক্সেস দেওয়ার সুবিধাও রয়েছে। এটি আমাকে উদাহরণস্বরূপ, একটি অর্ডার উদাহরণ পুনরুদ্ধার করতে এবং তারপরে Order.Customer.FirstNameস্পষ্টভাবে একটি যোগদান না করেই করতে দেয় যা অত্যন্ত সুবিধাজনক।

তাই পুনরুদ্ধার করার জন্য, আমার প্রশ্নগুলি হ'ল:

  1. স্বাধীন সমিতিগুলি ব্যবহারে কোনও উল্লেখযোগ্য অসুবিধা আছে কি? এবং...
  2. যদি কিছু না থাকে তবে বিদেশী কী সংযুক্তিগুলি ব্যবহার করার কারণ কী হবে?

উত্তর:


106

আপনি যদি ওআরএমের পুরো সুবিধা নিতে চান তবে আপনি অবশ্যই সত্তা রেফারেন্সটি ব্যবহার করবেন:

public class Order
{
    public int ID { get; set; }
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

আপনি একবার এফকে দিয়ে ডাটাবেস থেকে কোনও সত্তা মডেল তৈরি করলে এটি সর্বদা সত্তার রেফারেন্স উত্পন্ন করে। আপনি যদি সেগুলি ব্যবহার করতে না চান তবে আপনাকে অবশ্যই EDMX ফাইলটি ম্যানুয়ালি সংশোধন করতে হবে এবং এফকেগুলির প্রতিনিধিত্বকারী বৈশিষ্ট্য যুক্ত করতে হবে। অন্তত সত্ত্বা ফ্রেমওয়ার্ক v1 এর ক্ষেত্রে এটি ছিল যেখানে কেবল স্বতন্ত্র সংস্থাগুলির অনুমতি ছিল।

সত্তা ফ্রেমওয়ার্ক v4 বিদেশী কী সমিতি নামে একটি নতুন ধরণের সমিতি সরবরাহ করে। স্বাধীন এবং বিদেশী কী সমিতির মধ্যে সর্বাধিক সুস্পষ্ট পার্থক্য হ'ল অর্ডার শ্রেণিতে:

public class Order
{
    public int ID { get; set; }
    public int CustomerId { get; set; }  // <-- Customer ID
    public Customer Customer { get; set; } // <-- Customer object
    ...
}

আপনি দেখতে পাচ্ছেন যে আপনার কাছে এফকে সম্পত্তি এবং সত্তা রেফারেন্স উভয়ই রয়েছে। দুই ধরণের সংঘের মধ্যে আরও পার্থক্য রয়েছে:

স্বতন্ত্র সমিতি

  • এটি পৃথক বস্তু হিসাবে প্রতিনিধিত্ব করা হয় ObjectStateManager। এর নিজস্ব আছে EntityState!
  • সমিতি তৈরি করার সময় আপনার সর্বদা অ্যাসোসিয়েশনের উভয় প্রান্ত থেকে এনটাইটেলাইটের প্রয়োজন হয়
  • এই সমিতিটি সত্তার মতো একইভাবে ম্যাপ করা হয়েছে।

বিদেশী কী সমিতি

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

আপনি যদি বিদেশী কী সমিতি ব্যবহার করতে চান তবে আপনাকে অবশ্যই সত্তা ডেটা মডেল উইজার্ডের মডেলটিতে বিদেশী কী কলামগুলি অন্তর্ভুক্ত করে টিক দিতে হবে ।

সম্পাদনা:

আমি দেখতে পেলাম যে এই দুই ধরণের সংঘের মধ্যে পার্থক্য খুব বেশি পরিচিত নয় তাই আমি আরও একটি বিবরণ এবং এ সম্পর্কে আমার নিজের মতামত সহ একটি ছোট্ট নিবন্ধ লিখেছিলাম


আপনার অত্যন্ত অন্তর্দৃষ্টিপূর্ণ উত্তরের জন্য এবং সঠিক পরিভাষার জন্য শীর্ষস্থানীয়দের জন্য ধন্যবাদ, যা আমাকে এই বিষয়ের উপর প্রচুর সংস্থান এবং উভয় কৌশলগুলির পক্ষে / কনস-এর পক্ষে সহায়তা করেছে।
ড্যানিয়েল লিয়ুজি

1
আমি আপনার নিবন্ধটি জুড়ে এসেছি, লেডিস্লাভ। এই দুটি পদ্ধতির মধ্যে পার্থক্যটি আরও বোঝার জন্য খুব আকর্ষণীয় পড়া এবং দুর্দান্ত উত্স। চিয়ার্স।
ড্যানিয়েল লিউজি

1
@ গাউসজেড: আমি জানি যেহেতু ইএফ 4 (যেখানে এফকে অ্যাসোসিয়েশনগুলির সূচনা হয়েছিল) থেকে সমিতিগুলি কীভাবে পরিচালনা করা হচ্ছে তাতে কোনও পরিবর্তন হয়নি।
লাডিস্লাভ মৃঙ্কা

1
এটি এবং অন্যান্য উত্তরগুলি পারফরম্যান্স উদ্বেগকে স্পর্শ করবে বলে মনে হয় না। তবে, বিভাগের ২.২ অনুসারে একটি এমএসডিএন নিবন্ধ থেকে ভিউ জেনারেশনের কর্মক্ষমতাকে প্রভাবিতকারী ফ্যাক্টরগুলি , ইনডিপেন্ডেন্ট অ্যাসোসিয়েশন ব্যবহার করে বিদেশী কী সংঘের তুলনায় ভিউ জেনারেশনের ব্যয় বাড়িয়েছে বলে মনে হচ্ছে।
ভিভারকে

1
@ লাডিস্লাভ মির্নকা: আপনি উপরে উল্লিখিত শিল্পকলার লিঙ্কটি কি ডাবল চেক করতে পারবেন? আমি এটি অ্যাক্সেস করতে পারবেন না।
ভিভারকে

34

ব্যবহার উভয়. এবং আপনার অস্তিত্বের রেফারেন্সগুলিকে অলস লোডিংয়ের অনুমতি দেওয়ার জন্য ভার্চুয়াল করুন। এটার মত:

public class Order
{
  public int ID { get; set; }
  public int CustomerID { get; set; }
  public virtual Customer Customer { get; set; } // <-- Customer object
  ...
}

এটি অপ্রয়োজনীয় ডিবি লুকআপগুলিতে সংরক্ষণ করে, অলস লোডিংয়ের অনুমতি দেয় এবং আপনি কী চান তা যদি জানেন তবে আপনি সহজেই আইডি দেখতে / সেট করতে পারবেন। মনে রাখবেন যে উভয় থাকা কোনওভাবেই আপনার টেবিলের কাঠামো পরিবর্তন করে না।


5
একমত। লাডিসালভের পরামর্শ অনুসারে এটিই আমি শেষ করেছি। এটি আপনাকে সত্যই উভয় বিশ্বের সেরা দেয়; যখন আপনার কেবলমাত্র পিকে প্রয়োজন এবং বাকী অংশের যত্ন নেবেন না তখন পুরো বস্তুটি এবং তার আইডিটি দরকার হয়।
ড্যানিয়েল লিউজি

9

ইন্ডিপেন্ডেন্ট অ্যাসোসিয়েশন ভালভাবে কাজ করে না AddOrUpdateএটি সাধারণত Seedপদ্ধতিতে ব্যবহৃত হয় । যখন রেফারেন্সটি কোনও বিদ্যমান আইটেম হয়, এটি আবার প্রবেশ করানো হবে।

// Existing customer.
var customer = new Customer { Id = 1, Name = "edit name" };
db.Set<Customer>().AddOrUpdate(customer);

// New order.
var order = new Order { Id = 1, Customer = customer };
db.Set<Order>().AddOrUpdate(order);

ফলাফল বিদ্যমান গ্রাহক পুনরায় inোকানো হবে এবং নতুন (পুনরায় সন্নিবেশ) গ্রাহক নতুন অর্ডার সঙ্গে যুক্ত করা হবে।


যদি না আমরা বিদেশী কী সমিতিটি ব্যবহার করি এবং আইডি নির্ধারণ করি।

 // Existing customer.
var customer = new Customer { Id = 1, Name = "edit name" };
db.Set<Customer>().AddOrUpdate(customer);

// New order.
var order = new Order { Id = 1, CustomerId = customer.Id };
db.Set<Order>().AddOrUpdate(order);

আমাদের প্রত্যাশিত আচরণ রয়েছে, বিদ্যমান গ্রাহক নতুন অর্ডারের সাথে যুক্ত হবে।


2
এটি একটি ভাল সন্ধান। তবে, কোনও গ্রাহককে অর্ডার দেওয়ার জন্য কাজের চারপাশের (এবং আমি সঠিক উপায়ে মনে করি) এটি ডিবি প্রসঙ্গে যেমন লোড করা হচ্ছে: var order = new Order { Id = 1, Customer = db.Customers.Find(1) }; বা আপনি ডিবি প্রসঙ্গ থেকে গ্রাহককে লোড করার জন্য নির্বাচন পদ্ধতি নির্বাচন করতে পারেন। এটি স্বাধীন সমিতি নিয়ে কাজ করে।
tala9999

4

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.