【问题标题】:How to define foreign key relationship in EF Core 2.1如何在 EF Core 2.1 中定义外键关系
【发布时间】:2018-12-08 10:45:27
【问题描述】:

我正在为我的 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 定义这种一用户一角色关系?

谢谢。

附件:-

【问题讨论】:

  • WHAT 你遇到了什么错误??
  • @marc_s 错误 - 无法将类型“int”隐式转换为“ims.domain.model.User”
  • 我不认为builder.HasOne(x =&gt; x.Role).WithOne(y =&gt; y.RoleId); 是必要的,因为按照惯例,您已经声明当您添加public int RoleId { get; set; }public virtual Role Role { get; set; } 属性时,您的用户实体应该只有一个角色。删除它,我确信您的应用程序会产生这种行为。

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


【解决方案1】:

不仅在 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 列
  • 我的意图是定义角色实体是主人,用户是孩子
  • 没有同样的问题
【解决方案2】:

Entity 框架的构建原则之一是“约定优于配置”,按照约定,我认为 builder.HasOne(x =&gt; x.Role).WithOne(y =&gt; y.RoleId); 没有必要,因为按照约定,您已经声明您的用户实体在添加时应该只有一个角色public int RoleId { get; set; }public virtual Role Role { get; set; } 属性。 删除它,我确信您的应用程序将产生我上面评论中所述的行为。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-01
      • 2016-06-11
      • 1970-01-01
      • 2020-12-10
      • 2021-01-06
      • 2019-10-15
      • 1970-01-01
      • 2011-07-23
      相关资源
      最近更新 更多