2014-03-14 36 views
8

我是新来的asp.net mvc和实体框架代码第一个apporach,我并不那么热衷于数据库。我提前为错误的术语或我理解事物的方式表示道歉。我如何使用实体框架使用实体框架代码优先使用Fluent API

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

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映射用户ID的方式和RoleId添加到具有一对多关系的User_Role表中,用户可以具有多个角色: User_Role lookup table

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

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

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

  • 这是我的问题的正确方法?
  • 一旦我有查找表,这仍然是正确的方式来声明我的导航属性,所以我可以稍后使用它像user.Roles和检索他们的角色?
  • 哪里将用户模型中的RoleId填充来自Roles表或User_Role?
  • 在查找表中有ID有什么用处?

在此先感谢!我非常感谢你的专业知识。

回答

22

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

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

如果您只需在User实体Roles财产,并在Role实体Users财产,EF会找出你要多到很多这两个之间,并创建一个表的主键两个实体都作为组合主键,这将用于将用户映射到角色。

当加载从数据库中,那么你可以使用Roles导航属性搞清楚用户具有哪些角色一个User,并且可以加载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

+0

非常感谢清理东西对我来说!现在它正在以正确的方式工作。 – edgarpetrauskas

+0

很好的答案!有一点与OP不匹配的是UserRoles中没有ID字段(请参阅OP的关系图中的User_Role)。 –