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

4

我正在使用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

你收到了什么错误信息? - marc_s
@marc_s 错误 - 无法隐式转换类型'int'到'ims.domain.model.User'。 - Kgn-web
我认为 builder.HasOne(x => x.Role).WithOne(y => y.RoleId); 不是必要的,因为您已经通过公开 public int RoleId { get; set; }public virtual Role Role { get; set; } 属性来声明您的 User 实体应该只有一个角色。移除它,我相信您的应用程序将会产生这种行为。 - Oswald Umeh
3个回答

9

除了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);
}

请查看帖子中的附件。它在用户表中生成了2列。 - Kgn-web
我的意图是定义Role实体为主,User为子。 - Kgn-web
仍然存在同样的问题。 - Kgn-web
让我们在聊天中继续这个讨论 - TanvirArjel

0
Entity framework建立在“约定优于配置”原则上之一,按照惯例,我认为builder.HasOne(x => x.Role)。WithOne(y => y.RoleId);是不必要的,因为按照惯例,您已经声明了您的用户实体应该只有一个角色,当您添加public int RoleId { get; set; }public virtual Role Role { get; set; }属性时。
移除它,我确定您的应用程序将产生与我上面评论中所述的行为相同。

-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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接