1

使用實體框架4和代碼首先我將如何創建支持此方案的模型:EF 4代碼優先和M2M2M

在應用程序中,有個用戶,每個用戶都屬於一個組和每個組用戶可以有一個更多角色。

例子:

我想能夠說,「給我麗莎」,響應返回用戶對象麗莎,與她所屬的組。對於每個組都有一個列表屬性,她具有該特定組的所有角色

任何人都可以幫助我使用代碼先對任何幫助/代碼示例進行建模,這將非常棒!

/最好的問候Vinblad

回答

2

編輯:這是您要求新模式。

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<UserPermission> Permissions { get; set; } 
} 

// Permission is extended junction table to model M:N between 
// User and Group but in addition it contains relation to Roles. 
// The ony disadvantage is that this model doesn't control that 
// role in the collection is also the role related to group. You 
// must either enforce it in application logic or create some additional 
// database construct to check it. 
public class UserPermission 
{ 
    public virtual int UserId { get; set; } 
    public virtual int GroupId { get; set; } 

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

public class Group 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<UserPermission> UserPermissions { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 
} 


public class Role 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<Group> Groups { get; set; } 
    public virtual ICollection<UserPermission> UserPermissions { get; set; } 
} 

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

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

     // Permission has composite key 
     modelBuilder.Entity<UserPermission>() 
      .HasKey(p => new {p.UserId, p.GroupId}); 

     // Permission doesn't have navigation property to user 
     modelBuilder.Entity<User>() 
      .HasMany(u => u.Permissions) 
      .WithRequired() 
      .HasForeignKey(p => p.UserId); 

     modelBuilder.Entity<Group>() 
      .HasMany(g => g.UserPermissions) 
      .WithRequired(p => p.Group) 
      .HasForeignKey(p => p.GroupId); 
    } 
} 

如代碼中所述,存在小的缺點。您可以通過使用額外的FK強制數據庫中的數據完整性來避免這種缺陷,而這種額外的FK不能由代碼先建模。您可以使用自定義的初始化補充說FK:

public class CustomInitializer : DropCreateDatabaseIfModelChanges<Context> 
{ 
    protected override void Seed(Context context) 
    { 
     context.Database.ExecuteSqlCommand(
      @"ALTER TABLE [dbo].[RoleUserPermissions] 
      WITH CHECK ADD CONSTRAINT [FK_RoleUserPermissions_RoleGroups] 
      FOREIGN KEY([Role_Id], [UserPermission_GroupId]) 
      REFERENCES [dbo].[RoleGroups] ([Role_Id], [Group_Id])"); 
    } 
} 

只需添加到您的應用程序初始化(僅用於調試 - 應用程序不應該能夠刪除其發佈的數據庫):

Database.SetInitializer(new CustomInitializer()); 
+0

謝謝拉迪斯拉夫,但我不知道這是否正確。如果我提取用戶,我可以選擇他/她所屬的組,但是如果我閱讀了此權限,我將無法查看用戶對某個組的角色。這將返回爲該組添加的所有角色,而不是屬於該組的用戶。我希望能夠說,「給我Lisa」,並且響應返回lisa的用戶對象,以及她所屬的組。對於每個組,都有一個列表屬性,包含她爲該特定組的所有角色。 – Vinblad 2011-03-21 09:11:31

+0

所以它是完全不同的要求。我會考慮的。 – 2011-03-21 09:36:50

+0

對不起,我在第一次描述時清楚地寫道:「每個用戶屬於一個或多個組,每個用戶可以擁有一個或多個角色」。希望你現在可以幫我理解我的要求。 – Vinblad 2011-03-21 09:53:43