我是 asp.net mvc 和 Entity Framework 代码优先方法的新手,我也不热衷于数据库。对于错误的术语或我理解事物的方式,我提前道歉。
现在进入问题。我有以下型号:
用户模型
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 => u.users 的部分给了我一个错误(我假设那是因为模型中没有 users 属性,所以他回答了他的问题但没有更新他的问题?)
我的问题:让 Ef 为我生成此表的准确流畅的 API 代码是什么?
我不确定的事情:(请随意忽略)
- 这是解决我的问题的正确方法吗?
- 一旦我有了查找表,这是否仍然是声明我的导航属性的正确方法,以便我以后可以像 user.Roles 一样使用它并检索他们的角色?
- User 模型中的 RoleId 将从哪里填充,Roles 表还是 User_Role?
- 在查找表中有一个 ID 有什么用吗?
提前致谢!非常感谢您的专业知识。
最佳答案
首先,您应该删除 User
模型中的 RoleId
属性。将其作为外键可以告诉用户具有哪个单一角色。由于一个用户可以有多个角色,外键不应该在用户表中,而应该在映射表中。
因此,您拥有的是用户和角色之间的多对多关系,Entity Framework
可以自动创建所需的映射表,而无需您进行任何配置。
如果您只是在 User
实体中有一个 Roles
属性,在 Role
实体中有一个 Users
属性, 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 个表:
关于database - 如何使用 Entity Framework Code First 和 Fluent API 映射到查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401290/