【问题标题】:Entity Framework Core - Error inserting many-to-many relationEntity Framework Core - 插入多对多关系时出错
【发布时间】:2018-06-24 03:48:18
【问题描述】:

我使用 Entity Framework Core 2.0.1,目标是通过辅助实体在数据库中插入一些多对多相关对象。但是,我得到了错误:

"无法跟踪实体类型“ReferenciaFabricanteTieneReferenciaConstructor”的实例,因为已在跟踪另一个具有键值“IdReferenciaConstructor:0, IdReferenciaFabricante:0”的实例。附加现有实体时,请确保只有一个实体实例附加了给定的键值。"。

我猜这个问题可能是在要插入的连接对象列表中,它们每个的外键(ID)都为 0,但我认为 EF 会摆脱这个为实体生成相应的值ID(如果是新的),插入/修改它们,最后是更新了这些值的连接。

为了实现这种多对多插入,我应该改变什么?

类是:

[Table("ReferenciasFabricante", Schema = "public")]
public class ReferenciaFabricante
{

    [Key]
    public int Id { get; set; }

    ...

    //JOIN TABLE
    public IList<ReferenciaFabricanteTieneReferenciaConstructor> ReferenciaFabricanteTieneReferenciaConstructor { get; set; }

}


[Table("ReferenciasConstructor", Schema = "public")]
public class ReferenciaConstructor
{

    [Key]
    public int Id { get; set; }

    ...

    //JOIN TABLE
    public IList<ReferenciaFabricanteTieneReferenciaConstructor> ReferenciaFabricanteTieneReferenciaConstructor { get; set; }

}


//JOIN TABLE
[Table("ReferenciaFabricanteTieneReferenciaConstructor", Schema = "public")]
public class ReferenciaFabricanteTieneReferenciaConstructor {

    [Key]
    public int IdReferenciaFabricante { get; set; }

    public ReferenciaFabricante ReferenciaFabricante { get; set; }

    [Key]
    public int IdReferenciaConstructor { get; set; }

    public ReferenciaConstructor ReferenciaConstructor { get; set; }
}

型号:

protected override void OnModelCreating(ModelBuilder modelBuilder) {

    modelBuilder.Entity<ReferenciaFabricanteTieneReferenciaConstructor>().HasKey(v => new { v.IdReferenciaFabricante, v.IdReferenciaConstructor });
}

代码:

foreach (ApplicationCore.Entities.ReferenciaFabricanteTieneReferenciaConstructor referenciaFabricanteTieneReferenciaConstructor in referenciaConstructor.ReferenciaFabricanteTieneReferenciaConstructor) {

    //ERROR
    _dbContext.ReferenciaFabricanteTieneReferenciaConstructor.Add(referenciaFabricanteTieneReferenciaConstructor);
}

【问题讨论】:

  • 您似乎正试图同时插入两个具有IdReferenciaConstructor = 0' and IdReferenciaFabricante = 0` 的对象。确保您只插入具有唯一值的对象。
  • 好像没有设置引用属性ReferenciaFabricanteReferenciaConstructor
  • @GertArnold 你完全正确。我忘了在实体中指定外键和逆属性。
  • @JakubJankowski 是的,这就是声明。不过不知道怎么解决。

标签: c# entity-framework-core


【解决方案1】:

正如 GertArnold 所说,缺少一些属性。 更新的课程:

[Table("ReferenciasFabricante", Schema = "public")]
public class ReferenciaFabricante
{

    [Key]
    public int Id { get; set; }

    ...

    //JOIN TABLE
    [InverseProperty("ReferenciaFabricante")]
    public IList<ReferenciaFabricanteTieneReferenciaConstructor> ReferenciaFabricanteTieneReferenciaConstructor { get; set; }

}


[Table("ReferenciasConstructor", Schema = "public")]
public class ReferenciaConstructor
{

    [Key]
    public int Id { get; set; }

    ...

    //JOIN TABLE
    [InverseProperty("ReferenciaConstructor")]
    public IList<ReferenciaFabricanteTieneReferenciaConstructor> ReferenciaFabricanteTieneReferenciaConstructor { get; set; }

}


//JOIN TABLE
[Table("ReferenciaFabricanteTieneReferenciaConstructor", Schema = "public")]
public class ReferenciaFabricanteTieneReferenciaConstructor {

    [Key]
    public int IdReferenciaFabricante { get; set; }

    [ForeignKey("IdReferenciaFabricante")]
    public ReferenciaFabricante ReferenciaFabricante { get; set; }

    [Key]
    public int IdReferenciaConstructor { get; set; }

    [ForeignKey("IdReferenciaConstructor")]
    public ReferenciaConstructor ReferenciaConstructor { get; set; }
}

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    相关资源
    最近更新 更多