2013-03-11 2 views
1

Я также использую .net 3.5 и Entity Framework 3.5 (не может обновиться до последней версии).SaveChanges on 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.

Может кто-нибудь помочь мне понять, почему это происходит? Как я уже сказал, entity Wheel имеет состояние Unchanged и имеет EntityID, поэтому он не должен обновляться или дублироваться в базе данных, поскольку это был новый объект.

+0

использование Sql Server Profiler, чтобы увидеть, что на самом деле отправить в базу данных (и когда). Я также не знаю, что такое Mapper, и если он вносит свой вклад в проблему - посмотрите, сколько объектов у вас есть в контексте перед SaveChanges(). Другой вопрос: если вы сопоставляете свои операции CUD с хранимыми процедурами, и если да, то что там происходит. – Pawel

ответ

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

Смежные вопросы