2012-01-19 12 views
23

का उपयोग करके कई रिश्तों को कॉन्फ़िगर कैसे करें मैं पहले ईएफ कोड में कई रिश्तों को स्थापित करने की कोशिश कर रहा हूं लेकिन डिफ़ॉल्ट सम्मेलनों में यह गलत हो रहा है। निम्नलिखित वर्गों संबंध का वर्णन:इकाई फ्रेमवर्क धाराप्रवाह API

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

एक खाता कई उत्पाद हो सकता है।

हालांकि एफई सम्मेलनों के रूप में डीबी टेबल बना देगा:

Products Table 
-------------- 
Id 
Name 
Account_Id <- What is this? 

Accounts Table 
-------------- 
Id 
Name 

यह एक बहुत-से-अनेक तालिका संरचना की तरह नहीं दिखता? मैं कैसे संबंध को प्रतिबिंबित और एक मध्यस्थ तालिका बनाने के लिए धाराप्रवाह एपीआई कॉन्फ़िगर प्राप्त कर सकते हैं:

AccountProducts Table 
--------------------- 
Account_Id 
Product_Id 
+1

कि जो आप कई लोगों के लिए एक बहुत चाहते हैं नहीं है? –

+0

धन्यवाद - सही अर्थ – Fixer

+1

सही स्वरूपित प्रश्न को प्रतिबिंबित करने के लिए शीर्षक संपादित करें। समझने में आसान। –

उत्तर

53
modelBuilder.Entity<Account>() 
      .HasMany(a => a.Products) 
      .WithMany() 
      .Map(x => 
      { 
       x.MapLeftKey("Account_Id"); 
       x.MapRightKey("Product_Id"); 
       x.ToTable("AccountProducts"); 
      }); 
+0

इसके लिए धन्यवाद - इसे स्वीकार किए गए उत्तर के रूप में चिह्नित किया जाएगा क्योंकि इससे मुझे उत्पाद वर्ग – Fixer

+0

में एक (अनइडेड) एसोसिएशन जोड़ने की आवश्यकता के बिना एक यूनी-दिशात्मक सहयोग स्थापित करने की अनुमति मिलती है यदि मैं सहसंबंध तालिका पर अतिरिक्त डेटा का पालन करना चाहता हूं तो क्या होगा , date_added, संबंध प्रकार आदि की तरह। क्या मैं खाता प्रोडक्ट्स के लिए एक पीओसीओ परिभाषित कर सकता हूं? और आप इस मामले में मैपिंग कैसे करेंगे? – hazimdikenli

+0

@ हाज़ीमडिइकेंली: आप तब कई से अधिक रिश्तों का उपयोग नहीं कर सकते हैं। आपको इसे दो-से-कई रिश्तों के साथ मॉडल करना होगा। विवरण यहां हैं: http://stackoverflow.com/questions/7050404/create-code-first-many-to-many-with-additional-fields-in-association-table/7053393#7053393 – Slauma

6

क्या एफई का सुझाव दिया है एक-से-अनेक संबंध है।

एक खाता कई उत्पाद हो सकता है, यानी प्रत्येक उत्पाद आप कई रिश्ते के लिए कई चाहते हैं (और एक मध्यस्थ तालिका बनाने) यदि किसी ACCOUNT_ID

है, निम्नलिखित काम करना चाहिए

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Account> Accounts { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 
+0

ओह यह आसान था - लेकिन हमें यहां द्वि-दिशात्मक सहयोग की आवश्यकता क्यों है? डोमेन मॉडल में हम प्रत्येक उत्पाद के माध्यम से खातों तक नहीं पहुंचना चाहते हैं। – Fixer

+0

यदि कोई उत्पाद नहीं जानता कि यह किस खाते से जुड़ा हुआ है, तो संबंध को परिभाषित करने का कोई तरीका नहीं है। यदि आपका उपयोग मॉड्यूल का उपयोग करता है, उदाहरण के लिए, आप हमेशा खाता आईडी को बाहर कर सकते हैं और केवल उस डेटा को मैप कर सकते हैं जिसकी आपको आवश्यकता है – NinjaNye

+0

क्या आप द्वि-दिशात्मक एसोसिएशन को छुपाने (एक्सेस संशोधक?) को किसी भी तरीके से जानते हैं? – Fixer

1

कोड पहले सही संबंधपरक तरीके से टेबल बना रहा है। जब

एक खाते में कई उत्पाद हो सकते हैं।

उत्पाद तालिका को अपने खाते के लिए कुंजी स्टोर करना चाहिए, क्योंकि वास्तव में यह वास्तव में करता है।

जो आप डीबी में देखने की कोशिश कर रहे हैं, वह कई से अधिक रिश्ते हैं, कई लोगों में से एक नहीं। आप कोड के साथ कि प्राप्त करने के लिए पहले चाहते हैं, तो आप अपने संस्थाओं

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Account> Accounts { get; set; } 
} 

class Account 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
} 

इस मामले में नया स्वरूप देना चाहिए, एक उत्पाद कई खाते हो सकते हैं, और एक खाते में कई उत्पादों हो सकता है।

1
 public AccountProductsMap() 
    { 
     this.ToTable("AccountProducts"); 
     this.HasKey(cr => cr.Id); 

     this.HasMany(cr => cr.Account) 
      .WithMany(c => c.Products) 
      .Map(m => m.ToTable("AccountProducts_Mapping")); 
    } 
संबंधित मुद्दे