首先在EntityFramework代码中的一对一关系-设置关系的列名称

本文关键字:关系 设置 一对一 EntityFramework 代码 | 更新日期: 2023-09-27 18:12:56

我创建了以下实体。

[Table("User")]
public class User
{
    [...]
    [Key]
    public String ID { get; set; }
    [Column("CreatedBy")]
    public virtual User CreatedBy { get; set; }
}

:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy)
        .WithRequiredPrincipal();
}

创建表时,CreatedBy的列名是"User_ID",尽管我使用了Column属性。栏名应该是"CreatedBy"

我把上面的代码行改为
   modelBuilder.Entity<User>().HasRequired(a => a.CreatedBy)
       .WithRequiredPrincipal().Map(e =>   e.MapKey("CreatedBy"))

并在包管理器中添加了一个带有add-migration的新迁移。在Update-Database上,我得到消息:'DALDbContext中的实体。用户参与"User_CreatedBy"关系。找到0个相关的User_CreatedBy_Source。1 User_CreatedBy_Source

我的表是空的。有人知道解决这个问题的方法吗?

首先在EntityFramework代码中的一对一关系-设置关系的列名称

不确定是什么导致了你的确切问题。然而,我可能只会坚持基于属性的配置或基于流畅api的配置。在这两种情况下,最好的做法是同时包含导航属性和外键。采用这种方法既好又干净,可能会解决您的问题。

基于

属性的

public class User
{
   [Key]
   public string Id { get; set; }
   [Column("CreatedBy")]
   public int? CreatedByUserId { get; set; }
   [ForeignKey("CreatedByUserId")]
   public virtual User CreatedBy { get; set; }
}

基于Fluent api的

public class User
{
   public string Id { get; set; }
   public int? CreatedByUserId { get; set; }
   public virtual User CreatedBy { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   // add in configuration for table name, pk, etc
   modelBuilder.Entity<User>()
      .Property(p => p.CreatedByUserId)
      .HasColumnName("CreatedBy");
   modelBuilder.Entity<User>()
      .HasOptional(x => x.CreatedBy)
      .WithMany()
      .HasForeignKey(x => x.CreatedByUserId);
}