【发布时间】: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' andIdReferenciaFabricante = 0` 的对象。确保您只插入具有唯一值的对象。 -
好像没有设置引用属性
ReferenciaFabricante和ReferenciaConstructor。 -
@GertArnold 你完全正确。我忘了在实体中指定外键和逆属性。
-
@JakubJankowski 是的,这就是声明。不过不知道怎么解决。