我在模型中映射了多对多关系。 材质实体与许多颜色实体相关,反之亦然。我正在使用和中间表格( MaterialColor ),它只有两个id列引用每个表中的每个id。
这是我在 DbContext 实现中配置的方式:
modelBuilder.Entity<Material>().HasMany<Color>(p => p.Colors).WithMany()
.Map(m =>
{
m.ToTable("MaterialColor");
m.MapLeftKey("MaterialId");
m.MapRightKey("ColorId");
});
到目前为止它还没有出现问题:除了现在我有另一个多对多关系映射到具有实体打印机的Material:映射的配置完全相同:
modelBuilder.Entity<Printer>().HasMany<Material>(p => p.Materials).WithMany()
.Map(m =>
{
m.ToTable("PrinterMaterial");
m.MapLeftKey("PrinterId");
m.MapRightKey("MaterialId");
});
当我尝试在 PrinterMaterial 中创建打印机实体及其与材质的关系时,会出现真正的问题,但我不想插入新材料或新颜色,当然, 既不是MaterialColor记录 。
我一直在修复这个问题并设法跳过它插入我不想插入的表中:
_dbContext.Printers.Add(printer);
foreach (var material in printer.Materials)
{
foreach (var color in material.Colors)
{
_dbContext.Entry(color).State = EntityState.Unchanged;
}
_dbContext.Entry(material).State = EntityState.Unchanged;
}
_dbContext.SaveChanges();
问题尚未完全解决,因为仍在尝试插入MaterialColor 。我不确定如何告诉EF跳过这种关系。
我试过了:
_dbContext.Entry(material).Property(m => m.Colors).IsModified = false;
但是我收到了这个错误:
附加信息:“材料”类型的属性“颜色”是 不是原始或复杂的财产。 Property方法只能是 用于原始或复杂属性。使用参考或 收集方法。
这是有道理的,因为“Colors”是一个集合。
我如何告诉EF忽略这种关系?
(P.S。:加载没有颜色的材料不是一种选择)
编辑:添加了打印机和打印机。材料初始化:
var printer = new Printer();
printer.Materials = new List<Material>();
printer.Materials.Add(_materialService.GetMaterialById(materialId)); // this gives the material with many properties populated, like Colors.
答案 0 :(得分:0)
由于我无法找到解决方法,因此我不得不删除此映射:
modelBuilder.Entity<Material>().HasMany<Color>(p => p.Colors).WithMany()
.Map(m =>
{
m.ToTable("MaterialColor");
m.MapLeftKey("MaterialId");
m.MapRightKey("ColorId");
});
使用两个字段创建实体:
public class MaterialColor : ICacheableEntity
{
public virtual Material Material { get; set; }
public virtual Color Color { get; set; }
public int ColorId { get; set; }
public int MaterialId { get; set; }
}
这样我可以根据需要将Material实体的MaterialColor集合元素设置为 Unchanged 。