实体框架核心 - 插入多对多关系时出错

时间:2018-01-15 13:45:07

标签: c# entity-framework-core

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

无法跟踪实体类型'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);
}

1 个答案:

答案 0 :(得分:0)

正如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; }
}