2011-11-08 19 views
5

हाय मैं उपयोगकर्ता और भूमिका के बीच कई रिश्तों के लिए अपनी इकाई ढांचे को स्थापित करने की कोशिश कर रहा हूं।इकाई फ्रेमवर्क उपयोगकर्ता भूमिकाएं कई रिश्तों के लिए कई

चित्र के नीचे पता चलता है कि डेटाबेस में बताया गया है:

Many to Many relationships

उपयोगकर्ता के लिए मॉडल है:

public class User : IEntity 
    { 
     public virtual int UserId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string UserName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string FirstName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public virtual string LastName { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(200)] 
     public virtual string EmailAddress { get; set; } 
     public int AreaId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation properties 
     //public virtual Role Role { get; set; } 
     public virtual Area Area { get; set; } 

     public virtual ICollection<Role> Roles { get; set; } 

} 

भूमिका के लिए आदर्श है:

public class Role : IEntity 
    { 
     public int RoleId { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(100)] 
     public string Name { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(1000)] 
     public string Description { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string CreatedByUserName { get; set; } 
     public DateTime CreatedDateTime { get; set; } 
     [Column(TypeName = "varchar")] 
     [StringLength(64)] 
     public string LastModifiedByUserName { get; set; } 
     public DateTime? LastModifiedDateTime { get; set; } 

     //Navigation Properties 
     public ICollection<User> Users { get; set; } 
    } 

UserRole है:

public class UserRole 
    { 
     public int UserId { get; set; } 
     public int RoleId { get; set; } 

     //Navigation properties 
     public virtual User User { get; set; } 
     public virtual Role Role { get; set; } 
    } 

तो मैंने सोचा कि मैं इस ठीक की स्थापना की, लेकिन मेरे कोड में मैं की तरह कुछ जाना:

var roles = from r in user.Roles 
         select r.Name; 

और यह अपने आप की त्रुटियों दे रही है गोली मारता है:

Server Error in '/' Application. 
Invalid object name 'dbo.RoleUser'. 

तो मैं निम्नलिखित जोड़ा संदर्भ के लिए: की

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<User>() 
       .HasMany(i => i.Roles) 
       .WithMany(u => u.Users); 

} 

हालांकि अब मैं हो रही त्रुटियों:

'/' एप्लिकेशन में सर्वर त्रुटि। अमान्य कॉलम नाम 'Role_RoleId'। अमान्य कॉलम नाम 'User_UserId'।

तो निश्चित रूप से मेरे यहां कुछ सही तरीके से स्थापित नहीं है। क्या मैं सही दिशा में मुझे इंगित कर सकता हूं?

उत्तर

9

आपको लिंक तालिका UserRole को कक्षा के रूप में मॉडल करने की आवश्यकता नहीं है क्योंकि इसमें केवल संबंधों में भाग लेने वाली तालिकाओं की प्राथमिक कुंजी है। तो UserRole कक्षा को हटा दें।

यदि आप मौजूदा डेटाबेस का मॉडल कर रहे हैं, तो ईएफ लिंक तालिका का नाम RoleUser होने का अनुमान लगा सकता है। इससे बचने के लिए आप लिंक तालिका को निम्नानुसार कॉन्फ़िगर कर सकते हैं।

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<User>() 
      .HasMany(i => i.Roles) 
      .WithMany(u => u.Users) 
      .Map(m => 
      { 
       m.ToTable("UserRole"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("RoleId"); 
      }); 

} 
+0

इस मामले के बारे में कि रोल इकाई उपयोगकर्ता इकाई को नहीं जानता है? कॉन्फ़िगरेशन कोड कैसे लिखें? –

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