我是asp.net mvc的新手,而实体框架代码是第一个方法,我也不是很热衷于数据库。对于错误的术语或理解方式,我深表歉意。
现在提问题。我有以下型号:用户模型
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代码是什么?
我不确定的事情:(请忽略)
谢谢!非常感谢您的专业知识。
首先,您应该摆脱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个这样的表:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9hMHJaUS5wbmcifQ==” alt =“在此处输入图像描述”>“ >>