我是asp.net mvc和实体框架代码的第一个apporach新手,我不是那么热衷于数据库。我提前为错误的术语或我理解事物的方式道歉。
现在回答这个问题。我有以下型号:
用户模型
public class User
{
public int UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public int RoleId { get; set; }
[ForeignKey("RoleId")]
public virtual IEnumerable<Role> Roles { get; set; }
}
角色模型
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
}
我最终想要的是一种方法,使用Ef codefirst方法和流畅的API将UserId和RoleId映射到具有一对多关系的User_Role表,用户可以拥有多个角色:
我认为在this question中所做的是正确的方法,除了作者使用多对多连接。我试过这种方式,但u =&gt;部分u.users给了我一个错误(我假设这是因为模型中没有用户属性,所以他回答了他的问题,但没有更新他的问题?)
我的问题:让Ef为我生成此表格的确切流畅的api代码是什么?
我不确定的事情:(随意忽略)
提前致谢!我非常感谢你的专长。
答案 0 :(得分:28)
首先,您应该摆脱RoleId
模型中的User
属性。将其作为外键告诉用户具有哪个单一角色。由于用户可以拥有多个角色,因此外键不应位于用户表中,而应位于映射表中。
所以你拥有的是用户和角色之间的多对多关系,Entity Framework
可以自动创建所需的映射表,而无需配置任何东西。
如果您在Roles
实体中只有一个User
属性,而在Users
实体中只有一个Role
属性,则EF会发现您需要多个属性 - 在这两者之间,创建一个表,将两个实体的主键作为组合主键,用于将用户映射到角色。
从数据库加载User
时,您可以使用Roles
导航属性来确定用户拥有的角色,并且可以加载Role
以确定哪些用户是那个角色。
使其成功的最简单方法是:
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }
static Context()
{
Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
}
public Context()
: base("Server=localhost;Initial Catalog=Test;Integrated Security=True;")
{
}
}
public class User
{
public int UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public List<Role> Roles { get; set; }
}
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
public List<User> Users { get; set; }
}
运行该代码会产生3个这样的表: