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

时间:2014-03-14 09:43:46

标签: database asp.net-mvc-4 ef-code-first fluent

我是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表,用户可以拥有多个角色: User_Role lookup table

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

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

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

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

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

1 个答案:

答案 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个这样的表:

enter image description here