5

बहुत ही सरल मैं केवल एंटीटी फ्रेमवर्क 4.1 कोड का उपयोग कर रहा हूं और मैं इसके बजाय मॉडलबिल्डर पर धाराप्रवाह कॉल के साथ अपने [विदेशीके (..)] विशेषताओं को प्रतिस्थापित करना चाहता हूं। WithRequired (..) और HasForeignKey (..) के समान कुछ जो संबंधित नेविगेशन प्रॉपर्टी (MadeBySession) के साथ एक स्पष्ट विदेशी कुंजी प्रॉपर्टी (MadeBySessionId) को जोड़ता है। लेकिन मैं कई लोगों के लिए इसकी बजाय एक के एक के बाद एक को relationsip के लिए यह करने के लिए करना चाहते हैं:ईएफ 4.1 कोड प्रथम मॉडलबिल्डर हैरॉर्निइनके एक से एक रिश्तों के लिए

modelBuilder.Entity<..>().HasMany(..).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId) 

एक और अधिक ठोस उदाहरण नीचे है। यह [ForeignKey (..)] विशेषता के साथ काफी खुशी से काम करता है लेकिन मैं इसे दूर करना चाहता हूं और इसे मॉडलबिल्डर पर पूरी तरह कॉन्फ़िगर करना चाहता हूं।

public class VendorApplication 
{ 
    public int VendorApplicationId { get; set; } 

    public int CreatedBySessionId { get; set; } 
    public virtual Session CreatedBySession { get; set; } 
} 

public class Session 
{ 
    public int SessionId { get; set; } 

    [ForeignKey("CurrentApplication")] 
    public int? CurrentApplicationId { get; set; } 
    public virtual VendorApplication CurrentApplication { get; set; } 

    public virtual ICollection<VendorApplication> Applications { get; set; } 
} 

public class MyDataContext: DbContext 
{ 
    public IDbSet<VendorApplication> Applications { get; set; } 
    public IDbSet<Session> Sessions { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Session>().HasMany(x => x.Applications).WithRequired(x => x.CreatedBySession).HasForeignKey(x => x.CreatedBySessionId).WillCascadeOnDelete(false); 
     // Note: We have to turn off Cascade delete on Session <-> VendorApplication relationship so that SQL doesn't complain about cyclic cascading deletes 
    } 
} 

यहाँ एक सत्र में कई VendorApplications (Session.Applications) बनाने के लिए जिम्मेदार हो सकता है, लेकिन एक सत्र में एक समय (Session.CurrentApplication) को अधिकतम एक VendorApplication पर काम कर रहा है। मैं CurrentApplicationId प्रॉपर्टी को CurrentPpplication नेविगेशन प्रॉपर्टी के साथ मॉड्यूलबिल्डर में [विदेशीकी (..)] विशेषता के माध्यम से जोड़ना चाहता हूं।

चीजें मैं

की कोशिश की है जब आप [ForeignKey (..)] हटाने का श्रेय CurrentApplication संपत्ति डेटाबेस जो CurrentApplicationId स्तंभ से बंधा नहीं है में एक CurrentApplication_VendorApplicationId स्तंभ उत्पन्न करता है।

मैं स्पष्ट रूप से संबंध के रूप में नीचे CurrentApplicationId स्तंभ नाम का उपयोग कर मानचित्रण की कोशिश की है, लेकिन स्पष्ट रूप से यह एक त्रुटि उत्पन्न करता है क्योंकि डेटाबेस स्तंभ नाम "CurrentApplicationId" पहले से ही संपत्ति Session.CurrentApplicationId द्वारा इस्तेमाल किया जा रहा है:

modelBuilder.Entity<Session>().HasOptional(x => x.CurrentApplication).WithOptionalDependent().Map(config => config.MapKey("CurrentApplicationId")); 

ऐसा लगता है कि मुझे कुछ बहुत याद आ रहा है क्योंकि मैं जो करना चाहता हूं वह वही ऑपरेशन करता है जो [विदेशीकी (..)] करता है लेकिन मॉडल निर्माता के भीतर करता है। या यह एक मामला है कि यह बुरा अभ्यास है और स्पष्ट रूप से बाहर छोड़ा गया था?

उत्तर

10

आपको रिश्ते को एक-से-कई लोगों के रूप में मैप करना होगा और संबंध में संग्रह संपत्ति को छोड़ देना होगा।

modelBuilder.Entity<Session>() 
    .HasOptional(x => x.CurrentApplication) 
    .WithMany() 
    .HasForeignKey(x => x.CurrentApplicationId) 
+1

हाँ यह है! मैंने वास्तव में पहले उस कॉन्फ़िगरेशन के साथ खेला था लेकिन ईएफ ने एक बहुविकल्पीय-विवाद अपवाद फेंक दिया, इसलिए मैंने निर्धारित किया कि रिश्ते 1: 1 होना चाहिए। बेशक अब मुझे एहसास हुआ कि बहुतायत-संघर्ष वास्तव में हुआ क्योंकि मेरे पास मूल रूप से CurrentAplicationId गैर-शून्य के रूप में था ... ** (चेहरा हथेली) **। मदद के लिए धन्यवाद, बहुत सराहना की! – Walter