2011-12-04 18 views
7
public class Client 
{ 
    public Int32 ClientID { get; set; } 

    public virtual ICollection<Inquiry> InquiryManufacturers { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Inquiry> InquiryRetailers { get; set; } 
} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 

    public Int32 ClientID { get; set; } 
    public virtual Client Client { get; set; } 

    public virtual ICollection<Inquiry> Inquiries { get; set; } 
} 

public class Inquiry 
{ 
    public Int32 InquiryID { get; set; } 

    public Int32 ProductID { get; set; } 
    public Int32 ManufacturerID { get; set; } 
    public Int32 RetailerID { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Client Manufacturer { get; set; } 
    public virtual Client Retailer { get; set; } 
} 

Fluent एपीआईकोड पहले वैकल्पिक होने के लिए आवश्यक संबंध होने के कारण?

HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID); 
HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID); 

तो यहाँ के रूप में कुछ वर्गों है कि मैं परिभाषित किया है कर रहे हैं। उनके पास रिश्ते निम्नानुसार हैं: ग्राहक & उत्पाद में से कई के लिए एक है, ग्राहक & पूछताछ में से कई के लिए एक है और उत्पाद & पूछताछ में से कई के लिए एक है। मैं यहाँ पहले कोड का उपयोग कर रहा हूँ। अब धाराप्रवाह एपीआई का उपयोग करके मैंने संबंधों को परिभाषित किया है, इन रिश्तों को आवश्यक होना चाहिए, जिसका अर्थ क्लाइंट & उत्पाद संबंध शून्य नहीं हो सकता है और साथ ही क्लाइंट और पूछताछ भी शून्य नहीं हो सकती है।

हालांकि क्लाइंट & के बीच संबंध कोड प्रथम के साथ वैकल्पिक विकल्प होने के लिए मजबूर किया जा रहा है। जब मैं उन्हें आवश्यक बनाने की कोशिश करता हूं तो ईएफ डेटाबेस उत्पन्न नहीं करता है।

क्या कोई मुझे बता सकता है कि मेरे मॉडल के साथ क्या गलत है कि यह ईएफ को क्लाइंट & पूछताछ के बीच आवश्यक संबंध नहीं बना रहा है? क्या यह कैस्केड हटाने के कारण है? जैसा कि मैंने कुछ पढ़ा है जहां mssql में केवल एक कैस्केड क्लाइंट, उत्पाद और पूछताछ के बीच पथ को हटा सकता है। कोई भी मदद व्याख्या अच्छा होगा।

+0

क्या आपको कोई त्रुटि मिल रही है? इसका मतलब क्या है "इसे वैकल्पिक विकल्प बनने के लिए मजबूर किया जा रहा है"? – CDeutsch

+0

कोई त्रुटि नहीं है कि डेटाबेस जेनरेट नहीं होता है, लेकिन अगर मैं खुदरा विक्रेता और निर्माता आईडी को और फ़्लुएंट एपी को हैसऑप्शनल के रूप में बना देता हूं तो डेटाबेस उत्पन्न होता है। – user781310

+0

कृपया, पूर्ण मैपिंग कॉन्फ़िगरेशन पोस्ट करें: 3 इकाइयों से संबंधित सब कुछ पर चर्चा की जा रही है। अपनी स्थिति को पुन: पेश करने के लिए पर्याप्त जानकारी प्रदान करें। इसके अलावा, आप किस डीबी इंजन को लक्षित करते हैं? –

उत्तर

2

ईएफ कोड पहले डिफ़ॉल्ट रूप से उत्पन्न विदेशी कुंजी बाधा पर कैस्केड को सही हटा देता है। कोई

"विदेशी कुंजी बाधा 'Inquiry_Retailer' तालिका 'पूछताछ' चक्र या एक से अधिक झरना रास्तों का कारण हो सकता पर परिचय हटाए जाने पर आप निर्दिष्ट करें:। और क्योंकि आप केवल एक झरना पथ हो सकता है आप इस तरह एक अपवाद कुछ पाने कार्रवाई या अद्यतन से कोई भी कार्रवाई करने या बदलाव अन्य विदेशी कुँजी बाधाओं

अपने मॉडल में आप ग्राहक से पूछताछ करने के लिए 3 झरना पथ है:।

ग्राहक --InquiryRetailers ->पूछताछ
ग्राहक --InquiryManufacturers ->पूछताछ
ग्राहक --Products ->उत्पाद --Inquiries ->पूछताछ

तो आपको WillCascadeOnDelete(false) कम से कम दो संबंधों (आपकी आवश्यकताओं के आधार पर) सेट करने की आवश्यकता है:

modelBuilder.Entity<Inquiry>().HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID).WillCascadeOnDelete(false); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID).WillCascadeOnDelete(false); 
+0

धन्यवाद, देर से उत्तर के लिए खेद है, लेकिन मैं व्यस्त था, कुछ अन्य ब्लॉग और पुस्तक पढ़ने के बाद मुझे लगा कि डिफ़ॉल्ट कैस्केड हटाना मुद्दा था। – user781310