【问题标题】:One To Many mapping return invalid column name一对多映射返回无效的列名
【发布时间】:2019-07-16 05:44:14
【问题描述】:

我正在使用带有流畅 API 的 ef 核心在两个实体之间创建一对多关系,但它会引发错误

列名“UploadAttemptStatusId”无效。

我尝试过使用数据注释属性以及.HasForeignKey 方法。

public class UploadAttempts : BaseEntity
{
    public Guid UploadedAttemptId { get; set; }
       
    public string ClientFileName { get; set; }
    public DateTime CreationDateTimeUtc { get; set; }
    public Guid UploadingUserId { get; set; }
    public int UploadAttemptStatusId { get; set; }
    public virtual UploadAttemptStatusDictionary UploadAttemptStatusDictionary { get; set; }
}

public class UploadAttemptStatusDictionary : BaseEntity
{
    public int UploadAttemptStatusId { get; set; }
    public string Description { get; set; }
    public virtual ICollection<UploadAttempts> UploadAttempts { get; set; }
}


public void Map(ModelBuilder modelBuilder)
{
    var entity = modelBuilder.Entity<UploadAttemptStatusDictionary>();

    //set table name
    entity.ToTable("Upload_attempt_status_dictionary");

    entity.Property(t => t.UploadAttemptStatusId).HasColumnName("Upload_attempt_status");
    entity.HasKey(t => t.UploadAttemptStatusId);

    entity.Property(t => t.Description).HasColumnName("description").IsRequired();
    entity.HasMany(t => t.UploadAttempts).WithOne(t=>t.UploadAttemptStatusDictionary);
}


public void Map(ModelBuilder modelBuilder)
        {
            var entity = modelBuilder.Entity<UploadAttempts>();

            //set table name
            entity.ToTable("Upload_attempts");

            entity.Property(t => t.UploadedAttemptId).HasColumnName("upload_attempt_id");
            entity.HasKey(t => t.UploadedAttemptId);
            
            entity.Property(t => t.ClientFileName).HasColumnName("client_filename");
            entity.Property(t => t.UploadingUserId).HasColumnName("uploading_user_id");
            entity.Property(t => t.CreationDateTimeUtc).HasColumnName("creation_datetime_utc");

            entity.HasOne<UploadAttemptStatusDictionary>(t => t.UploadAttemptStatusDictionary)
                .WithMany(t => t.UploadAttempts)
                .HasForeignKey(t => t.UploadAttemptStatusId);
        }

【问题讨论】:

  • 哪里出现错误?您在两个表中都有 UploadAttemptStatusId。也许例外是关于另一个表。
  • 从第一张地图中删除 entity.HasMany(t =&gt; t.UploadAttempts).WithOne(t=&gt;t.UploadAttemptStatusDictionary); 行。应在一处配置关系以避免冲突的映射。还要确保模型和数据库同步(如果你这样做Add-Migration,它应该是空的。并且应该应用所有当前的迁移。)

标签: entity-framework-core ef-fluent-api


【解决方案1】:

我已经更新了如下实体,它可以工作,但它不符合 FluentAPI 约定。

根据 FluentAPI 约定,我们不必在映射器中映射外键,它应该直接使用 .HasOne() 或 .HasMany() 方法进行映射。 但就我而言,这是通过 UploadAttemptsMap 中的这一行实现的

entity.Property(t => t.UploadAttemptStatus).HasColumnName("upload_attempt_status");
public class UploadAttempts : BaseEntity
    {
        public Guid UploadedAttemptId { get; set; }
        public string ClientFileName { get; set; }
        public DateTime CreationDateTimeUtc { get; set; }
        public Guid UploadingUserId { get; set; }
        public int UploadAttemptStatus { get; set; }
        public virtual UploadAttemptStatusDictionary UploadAttemptStatusDictionary { get; set; }
    }

public class UploadAttemptStatusDictionary : BaseEntity
    {
        public int UploadAttemptStatus { get; set; }
        public string Description { get; set; }
        public virtual ICollection<UploadAttempts> UploadAttempts { get; set; }
    }

public void Map(ModelBuilder modelBuilder)
        {
            var entity = modelBuilder.Entity<UploadAttempts>();

            //set table name
            entity.ToTable("Upload_attempts");

            entity.Property(t => t.UploadedAttemptId).HasColumnName("upload_attempt_id");
            entity.HasKey(t => t.UploadedAttemptId);

            entity.Property(t => t.UploadAttemptStatus).HasColumnName("upload_attempt_status");
            entity.Property(t => t.ClientFileName).HasColumnName("client_filename");
            entity.Property(t => t.UploadingUserId).HasColumnName("uploading_user_id");
            entity.Property(t => t.CreationDateTimeUtc).HasColumnName("creation_datetime_utc");

            entity.HasOne<UploadAttemptStatusDictionary>(t => t.UploadAttemptStatusDictionary)
                .WithMany(t => t.UploadAttempts)
                .HasForeignKey(t => t.UploadAttemptStatus);
        }

public void Map(ModelBuilder modelBuilder)
        {
            var entity = modelBuilder.Entity<UploadAttemptStatusDictionary>();

            //set table name
            entity.ToTable("Upload_attempt_status_dictionary");

            entity.Property(t => t.UploadAttemptStatus).HasColumnName("upload_attempt_status");
            entity.HasKey(t => t.UploadAttemptStatus);

            entity.Property(t => t.Description).HasColumnName("description").IsRequired();
            entity.HasMany(x => x.UploadAttempts);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多