15

मुझे कोड फर्स्ट का उपयोग करके रिश्तों को कैसे परिभाषित करना चाहिए, लेकिन किसी भी नेविगेशन गुणों का उपयोग किए बिना?ईएफ 4 कोड पहला: नेविगेशन प्रॉपर्टी को जोड़ने के बिना रिलेशनशिप कैसे जोड़ें

पहले मैंने रिश्ते के दोनों सिरों में नेविगेशन गुणों का उपयोग करके वन-वन और कई-कई परिभाषित किए हैं। और डेटाबेस में उचित संबंध बनाए जाते हैं। यहां कक्षाओं की तरह दिखने का एक संक्षिप्त संस्करण है (मैंने सादगी के लिए कई लोगों को कई-कई रिश्तों को परिवर्तित कर दिया है)।

public class User 
{ 
    public string UserId { get; set; } 
    public string PasswordHash { get; set; } 
    public bool IsDisabled { get; set; } 
    public DateTime AccessExpiryDate { get; set; } 
    public bool MustChangePassword { get; set; } 

    public virtual Role Role { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<Right> Rights { get; set; } 
} 

public class Right 
{ 
    public Guid RightId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual Role Role { get; set; } 
} 

हालांकि, अगर मैं नेविगेशन गुणों को हटा देता हूं, तो कोई संबंध नहीं बनाया जा रहा है। यहां बताया गया है कि कक्षाएं कैसी दिखेंगी।

public class User 
{ 
    public string UserId { get; set; } 
    public string PasswordHash { get; set; } 
    public bool IsDisabled { get; set; } 
    public DateTime AccessExpiryDate { get; set; } 
    public bool MustChangePassword { get; set; } 

    public int Role RoleId { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
} 

public class Right 
{ 
    public Guid RightId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public int RoleId { get; set; } 
} 

ध्यान दें कि एक नेविगेशन संपत्ति के बजाय, मेरे पास संबंधित तालिका की प्राथमिक कुंजी है। सब कुछ टेबल पर बनाया जाता है - रिश्ते को छोड़कर। तो मैं यह करने के बारे में कैसे मिलता हूं?

बीटीडब्लू, मैंने डीबीकॉनटेक्स्ट की ऑनमोडेल क्रिएटिंग विधि में विभिन्न संयोजनों की कोशिश की है लेकिन इसका कोई फायदा नहीं हुआ है। किसी भी प्रकार की मदद की बेहद सराहना की जाती है!

धन्यवाद, मेल

उत्तर

24

मेरा मानना ​​है कि आप हमेशा जब कोड-पहले का उपयोग कर कम से कम एक ओर नेविगेशन संपत्ति की जरूरत है। फिर आप इसे मैप करने में सक्षम होंगे:

public class User 
{  
    public string UserId { get; set; }  
    public string PasswordHash { get; set; }  
    public bool IsDisabled { get; set; }  
    public DateTime AccessExpiryDate { get; set; }  
    public bool MustChangePassword { get; set; }  
    public int RoleId { get; set; } 
    public Role Role { get; set; } 
} 

public class Role 
{  
    public int RoleId { get; set; }  
    public string Name { get; set; }  
    public string Description { get; set; } 
} 

public class Right 
{  
    public Guid RightId { get; set; }  
    public string Name { get; set; }  
    public string Description { get; set; }  
    public int RoleId { get; set; } 
    public Role Role { get; set; } 
} 

public class TestContext : DbContext 
{ 
    public TestContext() : base("Entities") 
    {} 

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<User>() 
      .HasRequired(r => r.Role) 
      .WithMany() 
      .HasForeignKey(r => r.RoleId); 

     modelBuilder.Entity<Right>() 
      .HasRequired(r => r.Role) 
      .WithMany() 
      .HasForeignKey(r => r.RoleId); 
    } 
} 
+0

मुझे बहुत संदेह है। उदाहरण के लिए धन्यवाद। मैंने विदेशी कुंजी के साथ नेविगेशन गुणों का उपयोग करने का प्रयास किया है लेकिन विदेशी कुंजी पॉप्युलेट नहीं है, लेकिन ऐसा लगता है कि उत्तर आपके उदाहरण में है। धन्यवाद! – Mel

+0

यदि वास्तविक वस्तु के लिए कोई संपत्ति मौजूद है तो क्या आपको आईडी गुणों को परिभाषित करने की आवश्यकता होगी? तो उपयोगकर्ता ऑब्जेक्ट में आपको RoleId को परिभाषित करने की आवश्यकता होगी या यह केवल सुविधा के लिए है? – DDiVita

+1

@ डीडीवीटा: यदि आप 'उपयोगकर्ता' में 'RoleId' परिभाषित करते हैं या नहीं तो यह एक बड़ा अंतर है। मैं एक अंतर देखने के लिए इस उत्तर की अनुशंसा करता हूं: http://stackoverflow.com/questions/5281974/code-first-independent-associations-vs-foreign-key-associations/5282275#5282275 –

0

ईएफ 4.3 में, आप एक माइग्रेशन जोड़ सकते हैं जो रिश्ते को जोड़ता है।

+0

यह उत्तर इस उदाहरण से लाभान्वित होगा कि कैसे उस सुविधा का उपयोग करने के लिए। – ryanyuyu

1

आप संबंध जोड़ने के लिए fluent api का उपयोग कर सकते हैं, हालांकि "कॉन्फ़िगरेशन" कोड इकाई कोड से अलग है जो इसे कम खोजा जा सकता है।

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

  • कोई संबंधित समस्या नहीं^_^