edg*_*kas 10 database fluent ef-code-first asp.net-mvc-4
我是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; }
}
Run Code Online (Sandbox Code Playgroud)
榜样
public class Role
{
public int RoleId { get; set; }
public string RoleName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我最终想要的是一种方法,使用Ef codefirst方法和流畅的API将UserId和RoleId映射到具有一对多关系的User_Role表,用户可以拥有多个角色:
我假设在这个问题中所做的是正确的方法,除了作者使用多对多连接.我试过这种方式,但u => u.users的部分给了我一个错误(我假设这是因为模型中没有用户属性,所以他回答了他的问题,但没有更新他的问题?)
我的问题:让Ef为我生成这个表的确切流畅的api代码是什么?
我不确定的事情:(随意忽略)
提前致谢!我非常感谢你的专长.
Pet*_*sen 29
首先,您应该摆脱模型中的RoleId属性User.将其作为外键告诉用户具有哪个单一角色.由于用户可以拥有多个角色,因此外键不应位于用户表中,而应位于映射表中.
因此,您拥有的是用户和角色之间的多对多关系,并且Entity Framework可以自动创建所需的映射表,而无需您进行任何配置.
如果您只Roles在User实体中拥有属性并在实体中拥有Users属性,则RoleEF将确定您希望这两者之间存在多对多,并创建一个表,其中两个实体的主键为组合主键,这将用于将用户映射到角色.
User从数据库加载a时,您可以使用Rolesnavigation属性确定用户拥有的角色,并且可以加载a 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; }
}
Run Code Online (Sandbox Code Playgroud)
运行该代码会产生如下3个表:
