1
使用實體框架4和代碼首先我將如何創建支持此方案的模型:EF 4代碼優先和M2M2M
在應用程序中,有個用戶,每個用戶都屬於一個或更組和每個組用戶可以有一個或更多角色。
例子:
我想能夠說,「給我麗莎」,響應返回用戶對象麗莎,與她所屬的組。對於每個組都有一個列表屬性,她具有該特定組的所有角色
任何人都可以幫助我使用代碼先對任何幫助/代碼示例進行建模,這將非常棒!
/最好的問候Vinblad
使用實體框架4和代碼首先我將如何創建支持此方案的模型:EF 4代碼優先和M2M2M
在應用程序中,有個用戶,每個用戶都屬於一個或更組和每個組用戶可以有一個或更多角色。
例子:
我想能夠說,「給我麗莎」,響應返回用戶對象麗莎,與她所屬的組。對於每個組都有一個列表屬性,她具有該特定組的所有角色
任何人都可以幫助我使用代碼先對任何幫助/代碼示例進行建模,這將非常棒!
/最好的問候Vinblad
編輯:這是您要求新模式。
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());
謝謝拉迪斯拉夫,但我不知道這是否正確。如果我提取用戶,我可以選擇他/她所屬的組,但是如果我閱讀了此權限,我將無法查看用戶對某個組的角色。這將返回爲該組添加的所有角色,而不是屬於該組的用戶。我希望能夠說,「給我Lisa」,並且響應返回lisa的用戶對象,以及她所屬的組。對於每個組,都有一個列表屬性,包含她爲該特定組的所有角色。 – Vinblad 2011-03-21 09:11:31
所以它是完全不同的要求。我會考慮的。 – 2011-03-21 09:36:50
對不起,我在第一次描述時清楚地寫道:「每個用戶屬於一個或多個組,每個用戶可以擁有一個或多個角色」。希望你現在可以幫我理解我的要求。 – Vinblad 2011-03-21 09:53:43