2012-02-24 11 views
30

मैंइकाई की रूपरेखा 4.3 कोड पहले कई कई एक ही टेबल

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Town> Residencies { get; set; } 

    public virtual ICollection<Town> Mayorships { get; set; } 
} 

और

public class Town 
{ 
    [Key] 
    public long TownId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Residents { get; set; } 
    public virtual ICollection<User> Mayors { get; set; } 
} 

मुझे उम्मीद थी एफई दो कई के लिए कई संबंध बनाने की तरह एक मॉडल का उपयोग करते हुए स्वचालित रूप से बनाया का उपयोग टाउन रेसिडेंट्स और टाउनमेयर टेबल। मुझे यह परिणाम प्राप्त करने के लिए आवश्यक सम्मेलन या स्पष्ट एनोटेशन नहीं मिल रहा है।

इसके बजाय मुझे टाउन टेबल में दो एफके उपयोगकर्ता आईडी और उपयोगकर्ता तालिका में दो एफके टाउन आईडी मिल रहे हैं।

कोई विचार है कि ईएफ को कई रिश्ते में दो में देखने के लिए कैसे प्राप्त किया जाए?

धन्यवाद

उत्तर

30

खैर, एफई शब्द और व्याकरण मान्यता एल्गोरिथ्म जो पहचान करने के लिए है कि आप (शायद) चाहते हैं की आवश्यकता होगी किसी तरह का नहीं है कि User.Residencies और Town.Residents प्रपत्र नेविगेशन गुण की एक जोड़ी और User.Mayorships और Town.Mayors एक दूसरी जोड़ी बनाओ। इसलिए यह मानता है कि आपके पास चार एक-से-कई संबंध हैं और चार नेविगेशन गुणों में से प्रत्येक संबंधों में से एक है। (यह चार विदेशी कुंजी आप डेटाबेस तालिकाओं में देखा है के लिए कारण है।)

यह मानक धारणा नहीं है कि आप क्या चाहते हैं, इसलिए आप इस मानक सम्मेलन ओवरराइड करने के लिए स्पष्ट रूप से रिश्तों को परिभाषित करना होगा:

या तो

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    [InverseProperty("Residents")] 
    public virtual ICollection<Town> Residencies { get; set; } 

    [InverseProperty("Mayors")] 
    public virtual ICollection<Town> Mayorships { get; set; } 
} 

या Fluent एपीआई के साथ: डेटा एनोटेशन के साथ

modelBuilder.Entity<User>() 
    .HasMany(u => u.Residencies) 
    .WithMany(t => t.Residents) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownResidents"); 
    }); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Mayorships) 
    .WithMany(t => t.Mayors) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownMayors"); 
    }); 

Fluent एपीआई लाभ यह है कि आप nam नियंत्रित कर सकते हैं है लिंक तालिका का ई (और मुख्य कॉलम नाम भी)। आप उन नामों को डेटा एनोटेशन के साथ परिभाषित नहीं कर सकते हैं।

+0

धन्यवाद। मैंने दोनों विधियों की कोशिश की और वे दोनों काम करते थे, लेकिन जैसे आपने कहा था कि फ़्लुएंट विधि आपको टेबल नाम को नियंत्रित करने देती है, इसलिए मैं उस विधि को पसंद करता हूं। एक बार फिर धन्यवाद। – Sean

+0

मानचित्र भाग आवश्यक नहीं है। आपका धाराप्रवाह एपीआई कोड इसके बिना नौकरी करता है। – ozgur

संबंधित मुद्दे