实体框架和多对多映射:更新问题

时间:2015-08-25 17:03:34

标签: c# entity-framework

我在模型中映射了多对多关系。 材质实体与许多颜色实体相关,反之亦然。我正在使用和中间表格( 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.

1 个答案:

答案 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