如何使用Fluent API使用Entity Framework Code First映射到查找表

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表,用户可以拥有多个角色: User_Role查找表

我假设在这个问题中所做的是正确的方法,除了作者使用多对多连接.我试过这种方式,但u => u.users的部分给了我一个错误(我假设这是因为模型中没有用户属性,所以他回答了他的问题,但没有更新他的问题?)

我的问题:让Ef为我生成这个表的确切流畅的api代码是什么?

我不确定的事情:(随意忽略)

  • 这是我的问题的正确方法吗?
  • 一旦我有了查找表,这仍然是声明我的导航属性的正确方法,以便我以后可以像user.Roles一样使用它并检索他们的角色吗?
  • 从Roles表或User_Role中填充User模型中的RoleId?
  • 在查找表中有ID有用吗?

提前致谢!我非常感谢你的专长.

Pet*_*sen 29

首先,您应该摆脱模型中的RoleId属性User.将其作为外键告诉用户具有哪个单一角色.由于用户可以拥有多个角色,因此外键不应位于用户表中,而应位于映射表中.

因此,您拥有的是用户和角色之间的多对多关系,并且Entity Framework可以自动创建所需的映射表,而无需您进行任何配置.

如果您只RolesUser实体中拥有属性并在实体中拥有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个表:

在此输入图像描述