gpt4 book ai didi

c# - 如何将用户/权限关系定义为 M :M?

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:41 25 4
gpt4 key购买 nike

Resource 作为MAction 相关:M 通过Permission 加入表/单独的实体。用户可以有许多命名权限。可以将相同的权限分配给多个用户。

如何定义User-Permission关系为M:M?它在 EF 中会是什么样子?

编辑

  • 我应该将 ResourceId 和 ActionId 结合起来作为 EF 中的主键吗?
  • 然后如何将 PermissionUser 相关联?
  • 如何进行插入/选择?

这样映射是否正确:

modelBuilder.Entity<User>()
.HasMany(u => u.Permissions)
.WithMany(p => p.Users)
.Map(c => {
c.MapLeftKey("ResourceId");
c.MapLeftKey("ActivityId");
c.ToTable("UserPermissions");
});

假设 Permission 定义如下:

public class Permission {
public String Name { get; set; }

public Int32 ResourceId { get; set; }
public virtual Resource Resource { get; set; }

public Int32 ActivityId { get; set; }
public virtual Activity Activity { get; set; }

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

用户像这样:

public class User : Entity {
public String Username { get; set; }
public String UserImagePath { get; set; }
public String Password { get; set; }
public virtual ISet<Permission> Permissions { get; set; }

public User(String username, String password) {
this.Username = username;
this.Password = password;
this.Permissions = new HashSet<Permission>();
}
}

最佳答案

User 之间创建多对多关系和 Permission您需要创建两个类型为 ICollection<> 的导航属性:

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

public virtual ICollection<Permission> Permissions { get; set; }
}

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

public int ResourceId { get; set; }
public virtual Resource Resource { get; set; }

public int ActionId { get; set; }
public virtual Action Action { get; set; }

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

Code First 约定将识别多对多关系并使用表的适当键在数据库中构建一个连接表加盟。键既是连接表的主键又是指向的外键连接的表。新表的名称是通过组合名称创建的它加入的类,然后将结果复数化。

如果您喜欢自己做,可以使用 Fluent Api 来完成.一个简单的方法是覆盖 OnModelCreating你的上下文的方法。我在下面展示了一个示例,您的情况如何:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasKey(p => p.Id);
modelBuilder.Entity<User>().Property(u => u.Name).IsRequired();
modelBuilder.Entity<User>().Property(u => u.Password).IsRequired();

modelBuilder.Entity<Permission>().HasKey(p => p.Id);
modelBuilder.Entity<Permission>().Property(u => u.Name).IsRequired();

//configuring the many-to-many relationship
modelBuilder.Entity<User>()
.HasMany(u => u.Permissions)
.WithMany(p => p.Users)
.Map(c => c.ToTable("UserPermissions"));
}

如您所见,您不仅可以使用 Fluent Api 来指定您的关系。此外,您可以指定哪个属性将是主键,如果需要某些属性,等等。所有这些您也可以使用 Data Annotations 来完成。 .

关于c# - 如何将用户/权限关系定义为 M :M?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27945718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com