6

शायद यह इसलिए है क्योंकि ईएफ कोड के साथ मेरा ज्ञान पहले धाराप्रवाह एपीआई की कमी है, लेकिन मैं स्टंप हो गया हूं।ईएफ कोड पहला: कई से कई और एक से कई

मैं निम्नलिखित मॉडल बनाना चाहते हैं:

  • एक समूह संग्रह आईडी और नाम के साथ
  • आईडी और नाम
  • के साथ एक उपयोगकर्ता संग्रह प्रत्येक उपयोगकर्ता ठीक एक प्राथमिक समूह को निर्दिष्ट किया है
  • प्रत्येक उपयोगकर्ता में शून्य या कई माध्यमिक समूह हो सकते हैं

तालिका संरचना मैं के लिए जा रहा हूँ दिखाई देगा:

समूह

  • ईद
  • नाम

उपयोगकर्ता

  • ईद
  • नाम
  • PrimaryGroupId

SecondaryGroupAssignments

  • UserId
  • ग्रुप

मैं इस मॉडल करने के लिए कोशिश कर रहा एक दीवार के खिलाफ मेरे सिर की धड़कन किया गया है ईएफ कोड फर्स्ट के साथ, bu मैं इसे उपयोगकर्ता और समूह के बीच दोनों रिश्तों को स्वीकार करने के लिए नहीं मिल सकता। किसी भी .NET कोड को पोस्ट न करने के लिए खेद है (मुझे खुशी है), लेकिन शायद यह सब गलत है।

क्या ईएफ मॉडल बनाने का कोई तरीका है? मुझे लगता है कि मुझे फ्लुएंट एपीआई के साथ कुछ प्रकार की कॉन्फ़िगरेशन करना है। शायद एक बेहतर सवाल यह है: क्या फ्लुएंट एपीआई के लिए कोई अच्छा, निश्चित संदर्भ है?

धन्यवाद!

उत्तर

16

प्रयास करें इस (untested):

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

    public virtual ICollection<User> PrimaryUsers { get; set; } 
    public virtual ICollection<User> SecondaryUsers { get; set; } 
} 

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int PrimaryGroupId { get; set; } 

    public virtual Group PrimaryGroup { get; set; } 
    public virtual ICollection<Group> SecondaryGroups { get; set; } 
} 

public class Context : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Group> Groups { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<User>() 
        .HasRequired(u => u.PrimaryGroup) 
        .WithMany(g => g.PrimaryUsers) 
        .HasForeignKey(u => u.PrimaryGroupId) 
        .WillCascadeOnDelete(false); 

     modelBuilder.Entity<User>() 
        .HasMany(u => u.SecondaryGroups) 
        .WithMany(g => g.SecondaryUsers) 
        .Map(m => m.MapLeftKey("UserId") 
           .MapRightKey("GroupId") 
           .ToTable("SecondaryGroupAssignments")); 
    } 
} 
+3

क्या मैं सिर्फ लद्दीस्लाव कह सकता हूं कि यह सबसे उपयोगी पोस्टों में से एक है जिसे मैंने कभी भी अपनी सटीक समस्या को हल करने के लिए आने/उपयोग करने का आनंद लिया है! धन्यवाद! – LiverpoolsNumber9

+0

लाड एंटिटी फ्रेमवर्क वाला व्यक्ति है, इसलिए इस तरह के एक महान संसाधन के लिए आभारी है। स्टैक शानदार है एक और कारण! – Sam

3

Ladislav उत्तम जवाब के आधार पर, यहाँ कैसे किसी भी मैपिंग का उपयोग किए बिना यह करने के लिए है - खुद को सिर्फ मॉडल वर्गों के लिए लागू किया विशेषताओं:

public class Group 
{ 
    public int Id { get; set; } 

    [MaxLength(300)] 
    public string Name { get; set; } 

    public ICollection<User> Users { get; set; } 
} 

public class User 
{ 
    public int Id { get; set; } 

    [MaxLength(300)] 
    public string Name { get; set; } 

    [ForeignKey("PrimaryGroup")] 
    public int PrimaryGroupId { get; set; } 
    [Required] 
    public Group PrimaryGroup { get; set; } 

    [InverseProperty("Users")] 
    public ICollection<Group> SecondaryGroups { get; set; } 
} 

नोट्स

यदि आप चाहते हैं, तो आप वर्चुअल कीवर्ड को 2 ICollection एस और Group में जोड़ सकते हैं। यह allows lazy-loading। प्रदर्शन के अनुसार, मैं इसकी अनुशंसा नहीं करता, लेकिन यह संभव है।

मैं, 300 की एक मनमाना (लेकिन सुरक्षित) लंबाई के साथ MaxLength गुण शामिल क्योंकि तार एक MaxLength बिना एफई में बाहर डाल हो जाता है आप कम प्रदर्शन NVarChar(MAX) कॉलम। क्या पूछा जा रहा है के लिए पूरी तरह से अप्रासंगिक लेकिन अच्छा कोड पोस्ट करने के लिए बेहतर है।

मैं आपके ईएफ कक्षाओं के लिए कक्षा के नाम "उपयोगकर्ता" और "समूह" के खिलाफ अनुशंसा करता हूं। वे किसी भी एसक्यूएल को जटिल करने जा रहे हैं जिसे आप बाद में चलाने के लिए [उपयोगकर्ता] और [समूह] टाइप करना चाहते हैं, और इन वर्गों का उपयोग एमवीसी नियंत्रकों में करते हुए जटिल करते हैं, जहां आपकी कक्षा UserContext संपत्ति User के साथ संघर्ष करेगी जो आपको देता है Asp.Net पहचान पुस्तकालय तक पहुंच।

+0

मेरी इच्छा है कि मैं इस जवाब को दो बार वोट दूंगा! बहुत धन्यवाद क्रिस ... – stt106

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