如何使用Fluent API首先使用实体 框架代码映射到查找表

问题描述 投票:10回答:2

我是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代码是什么?

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

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

谢谢!非常感谢您的专业知识。

database asp.net-mvc-4 ef-code-first fluent
2个回答
29
投票

首先,您应该摆脱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 =“在此处输入图像描述”>“ >>


© www.soinside.com 2019 - 2024. All rights reserved.