我也在使用.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,因此它不应该更新或在数据库上重复,因为它是一个新实体。
答案 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