1

我也在使用 .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 的数据库上创建了一个新副本。

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

4

1 回答 1

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();
    }
}

请记住,您不能在其他地方创建映射(在调用此方法之前),否则它将使用先前声明的配置并且没有忽略语句。

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

于 2013-03-13T09:26:09.510 回答