如何在EF Core 2.1中定义外键关系

时间:2018-12-08 10:45:28

标签: c# entity-framework asp.net-core ef-core-2.1

我的DAL使用的是EF Core 2.1。这就是我的模型的样子

一个用户只能拥有一个角色:

// Role entity - kind of master
public class Role
{
    public int RoleId { get; set; }

    public string RoleName { get; set; }
}

// User entity - every user will have one role
public class User
{
    public int UserId { get; set; }

    public string Email { get; set; }
    public string Password { get; set; }

    public int RoleId { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedOn { get; set; }

    public virtual Role Role { get; set; }
}

这就是我想/试图定义这两个实体之间的关系的方式:

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(x => x.UserId);
    builder.Property(x => x.RoleId).IsRequired(true);
    builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);

    // FK - throwing compile time error 
    builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
}

如何使用EF Fluent API定义此一个用户一个角色的关系?

谢谢。

附件:- enter image description here

3 个答案:

答案 0 :(得分:5)

不仅在FK关系配置中,CreatedOn列的默认值生成配置中还存在问题。因此,编写您的实体配置,如下所示:

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(u => u.UserId);
    builder.Property(u => u.CreatedOn).IsRequired(true).HasDefaultValueSql("getdate()");

    // FK - configuraiton
    builder.HasOne(u => u.Role).WithMany().HasForeignKey(u => u.RoleId).IsRequired(true);
}

答案 1 :(得分:0)

实体框架所基于的宗旨之一是“配置之上的约定”,按照惯例,我认为builder.HasOne(x => x.Role).WithOne(y => y.RoleId);不是必需的,因为按照惯例,您已经声明用户实体在以下情况下应该只扮演一个角色:您添加了public int RoleId { get; set; }public virtual Role Role { get; set; }属性。 删除它,我确定您的应用程序将产生上述行为中所述的行为。

答案 2 :(得分:-1)

我认为您可以像这样将用户添加到角色

public class Role
{
    public int RoleId { get; set; }

    public string RoleName { get; set; }
    public List<User> Users {get;set;}
}

然后您将像这样注册

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(x => x.UserId);
    builder.Property(x => x.RoleId).IsRequired(true);
    builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);


    builder.HasOne(x => x.Role).WithMany(y => y.Users);
}