【问题标题】:Saving data in asp.net core 3.1 Entity error, it adds fields在 asp.net core 3.1 Entity 中保存数据错误,它添加了字段
【发布时间】:2021-04-28 17:13:25
【问题描述】:

我在将模型保存在数据库中时遇到了问题。 我得到了以下模型:

[Table("data_details")]
    public class DataDetail
    {
        [Key]
        [Display(Name = "ID")]
        [Column("id")]
        public String Id { get; set; }

        [Display(Name = "QUALIFICATION")]
        [Column("qualification")]
        public decimal? Qualification { get; set; }

        [Display(Name = "DATA CONFIG ID")]
        [Column("data_config_id")]
        public String DataConfigId { get; set; } 
        public DataConfig DataConfig { get; set; }
    }

在我的 dbcontext 中,我有这样的:

    modelBuilder.Entity<DataDetail>().HasOne(c => c.Dataconfig).WithMany(w => w.DataDetails).HasForeignKey(c => c.DataConfigId);

    modelBuilder.Entity<DataDetail>().HasOne(c => c.Data).WithMany(w => w.DataDetails).HasForeignKey(c => c.DataId);

保存时

 _context.Add(dataDetail);
_context.SaveChanges();

它试图保存,但在日志中我得到一个错误,就像它试图添加一个额外的字段

INSERT INTO `data_details` (`id`, `qualification`,  `data_config_id`, `DataId`)
      VALUES (@p0, @p1, @p2, @p3);
Microsoft.EntityFrameworkCore.Update[10000]
      An exception occurred in the database while saving changes for context type 'Systema.Data.SystemaContext'.
      Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
       ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'DataId' in 'field list'

此表中根本没有指定DataId:S

【问题讨论】:

  • 这是因为这一行:modelBuilder.Entity&lt;DataDetail&gt;().HasOne(c =&gt; c.Data)... 你是说你定义的实体有一个映射的Data 属性——但你没有在你的实体中定义它。 IMO,我不确定它是否应该编译,因为 Data 不存在。
  • 我没有添加所有字段但是....我不知道模型之间的关系才能在数据库中插入数据。我在读取数据时将它们考虑在内
  • 因为您的 dbcontext 配置有这个 - modelBuilder.Entity&lt;DataDetail&gt;().HasOne(c =&gt; c.Data)... => 您是说您在 data_details 表中为数据定义了一个外键,在本例中为 DataId

标签: asp.net asp.net-core entity


【解决方案1】:

在您的dbcontext 中,您在DataconfigData 之间创建了many-to-many 关系。EFCore 将默认创建DataConfigIdDataId 作为DataDetail 的外键。

添加DataDetail 表示在DataconfigData 之间建立关系。你添加的DataIdDataconfigId必须是已有实体,否则会报错。

你的代码应该是:

 public class Data
{
    public string Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<DataDetail> DataDetails { get; set; }
}
public class DataDetail
{
    [Key]
    [Display(Name = "ID")]
    [Column("id")]
    public String Id { get; set; }

    [Display(Name = "QUALIFICATION")]
    [Column("qualification")]
    public decimal? Qualification { get; set; }

    [Display(Name = "DATA CONFIG ID")]
    [Column("data_config_id")]
    public string DataConfigId { get; set; }
    public DataConfig DataConfig { get; set; }

    [Display(Name = "DATA Data ID")]
    [Column("data_id")]
    public string DataId { get; set; }
    public Data Data { get; set; }
}
public class DataConfig
{
    public string Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<DataDetail> DataDetails {get;set;}
}

关于many to many releationship

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2020-07-29
    • 2020-05-09
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2021-02-11
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多