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

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

我是 asp.net mvc 和 Entity Framework 代码优先方法的新手,我也不热衷于数据库。对于错误的术语或我理解事物的方式,我提前道歉。

现在进入问题。我有以下型号:
用户模型

 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 => u.users 的部分给了我一个错误(我假设那是因为模型中没有 users 属性,所以他回答了他的问题但没有更新他的问题?)

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

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

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

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

最佳答案

首先,您应该删除 User 模型中的 RoleId 属性。将其作为外键可以告诉用户具有哪个单一角色。由于一个用户可以有多个角色,外键不应该在用户表中,而应该在映射表中。

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

如果您只是在 User 实体中有一个 Roles 属性,在 Role 实体中有一个 Users 属性, 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

关于database - 如何使用 Entity Framework Code First 和 Fluent API 映射到查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401290/

相关文章:

html - 转到调用 t.Execute 中的许多参数

c# - 拆分逗号以将多行插入数据库 (ASP.NET MVC)

entity-framework - Code First Entity Framework 和 Windows Azure SQL

javascript - MVC 更新部分 View onchange 下拉列表

c# - 如何在基于MVC4/EF 6+的应用中实现事务

c# - Entity Framework 代码优先 : Configuration. cs 种子或自定义初始值设定项

entity-framework - 首先使用实体​​框架代码与联结表建立一对多关系

mysql - 构建调查数据库方案

php - Google 新闻 - 网址方案和主键

python - 在 Python 上加载/使用 SQL 函数(避免往返)