.net 实体框架3.5上的SaveChanges正在保存未更改的实体(在数据库上复制)

.net 实体框架3.5上的SaveChanges正在保存未更改的实体(在数据库上复制),.net,entity-framework,savechanges,.net,Entity Framework,Savechanges,我也在使用.NET3.5和EntityFramework 3.5(无法升级到最新版本) 当我使用EF在数据库上保存新实体时,即使状态为“未更改”且ID>0,所有实体引用也会重复 下面是一些代码: public long Insert(CarDTO carDTO) { Car car = Mapper.Map<CarDTO, Car>(carDTO); using (var context = new Entities()) {

我也在使用.NET3.5和EntityFramework 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();
        }
    }
public长插页(CarDTO-CarDTO)
{
Car Car=Mapper.Map(carDTO);
使用(var context=new Entities())
{   
汽车,车轮=
上下文
.车轮
.FirstOrDefault(item=>item.ID==carDTO.Wheel.ID);
上下文。AddToCar(car);
SaveChanges();
}
}
如您所见,我只创建了一个类型为Car的新实体,但在执行SaveChanges时,它还会在被引用实体的数据库上创建一个新副本


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

找到了问题的解决方案

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

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();
    }
}
public长插页(CarDTO-CarDTO)
{
Map Map=Mapper.CreateMap();
map.ForMember(dto=>dto.Wheel,entity=>entity.Ignore());
Car Car=Mapper.Map(carDTO);
使用(var context=new Entities())
{   
汽车,车轮=
上下文
.车轮
.FirstOrDefault(item=>item.ID==carDTO.Wheel.ID);
上下文。AddToCar(car);
SaveChanges();
}
}
请记住,您不能在别处创建映射(在此方法调用之前),否则它将使用之前声明的配置,并且没有ignore语句


我使用的映射器是这样的:

找到了问题的解决方案

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

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();
    }
}
public长插页(CarDTO-CarDTO)
{
Map Map=Mapper.CreateMap();
map.ForMember(dto=>dto.Wheel,entity=>entity.Ignore());
Car Car=Mapper.Map(carDTO);
使用(var context=new Entities())
{   
汽车,车轮=
上下文
.车轮
.FirstOrDefault(item=>item.ID==carDTO.Wheel.ID);
上下文。AddToCar(car);
SaveChanges();
}
}
请记住,您不能在别处创建映射(在此方法调用之前),否则它将使用之前声明的配置,并且没有ignore语句


我使用的映射器是这样的:

使用Sql Server Profiler查看真正发送到数据库的内容(以及何时发送)。我也不知道映射器是什么,也不知道它是否导致了这个问题-在SaveChanges()之前,看看上下文中有多少实体。另一个问题是,是否将CUD操作映射到存储过程,如果映射到存储过程,会发生什么。请使用Sql Server Profiler查看真正发送到数据库的内容(以及何时发送)。我也不知道映射器是什么,也不知道它是否导致了这个问题-在SaveChanges()之前,看看上下文中有多少实体。另一个问题是,是否将CUD操作映射到存储过程,如果映射到存储过程,会发生什么。