Entity Framework 3.5上的SaveChanges正在保存未更改的实体(在数据库上复制它们)

时间:2013-03-11 11:30:33

标签: .net entity-framework savechanges

我也在使用.net 3.5和Entity Framework 3.5(无法升级到最新版本)。

当我使用EF在数据库中保存新实体时,即使状态为“未更改”且ID为>,所有实体引用也会重复。 0

以下是一些代码:

public long Insert(CarDTO carDTO)
    {
        Car car = Mapper.Map<CarDTO, Car>(carDTO);
        using (var context = new Entities())
        {   
            car.Wheel =
                context
                .Wheels
                .FirstOrDefault(item => item.ID == carDTO.Wheel.ID);

            context.AddToCar(car);
            context.SaveChanges();
        }
    }

如您所见,我只创建一个Car类型的新实体,但是当执行SaveChanges时,它还会在引用的实体Wheel的数据库上创建一个新副本。

有人可以帮我理解为什么会这样吗?正如我所说,实体轮已经处于状态Unchanged并且具有EntityID,因此它不应该更新或在数据库上重复,因为它是一个新实体。

1 个答案:

答案 0 :(得分:1)

找到问题的解决方案!

由于某种原因,映射不应映射引用实体。因此,避免引用实体的数据库复制的解决方案应忽略此引用的映射,如下例所示:

public long Insert(CarDTO carDTO)
{
    Map map = Mapper.CreateMap<CarDTO, Car>();
    map.ForMember(dto => dto.Wheel, entity => entity.Ignore());
    Car car = Mapper.Map<CarDTO, Car>(carDTO);
    using (var context = new Entities())
    {   
        car.Wheel =
            context
            .Wheels
            .FirstOrDefault(item => item.ID == carDTO.Wheel.ID);

        context.AddToCar(car);
        context.SaveChanges();
    }
}

请记住,您无法在其他地方创建映射(之前调用此方法),或者它将使用前一个声明的配置,并且没有ignore语句。

我使用的映射器就是这个:https://github.com/AutoMapper/AutoMapper