2009-08-12 2 views
0

У меня есть этот тест в моей тестовой базе:Почему AutoMapper/EF добавляет новый элемент вместо отношений?

public void WorksWithAreaUsers() 
     { 
      using (new TransactionScope()) 
      { 
       //arrange 
       var userBusiness = new UserBusiness(); 
       var user = new User 
       { 
        Name = "TestUser###", 
        Login = "domain\test-user###" 
       }; 
       userBusiness.Add(user); 

       var areaBusiness = new AreaBusiness(); 
       var area = new Area 
       { 
        Name = "TestArea###", 
        Description = "Test Area Description", 
        Users = new List<User> { user } 
       }; 

       //act 
       areaBusiness.Add(area); 

       //assert 
       var areaFromDb = areaBusiness.FindById(area.AreaID); 
       Assert.IsNotNull(areaFromDb.Users); 
       Assert.IsTrue(areaFromDb.Users.Count > 0); 
       Assert.IsTrue(areaFromDb.Users.Any(c => c.UserID == user.UserID)); 
      } 
     } 

Что он делает:

  • Вставляет новый пользователь в базу;
  • Вставляет новую область в базу, с пользовательскими отношениями;

Что происходит на самом деле:

  • Новый пользователь вставляется;
  • Новая область вставлена;
  • Новый пользователь вставлен снова, с отношением площади;

Что может быть?

Дополнительная информация:

  • Площадь и Пользователь не EntityObjects на самом деле. Я сопоставляю DTO/Entity с помощью AutoMapper, я думаю, что проблема в этой логике. В какой-то момент мне нужно сопоставить List и EntityCollection. Я создаю новый EntityCollection и переводю User в UserEntity в эту коллекцию, используя метод EntityCollection.Add. Я думаю, что я должен использовать Attach, чтобы не создавать новый объект, но этот метод не работает при вызове EntityCollection без правильных привязок.

Вы предлагаете что-нибудь умное или какое-либо обходное решение для решения этой проблемы? Мне действительно нужны слои проекта (Web -> Business -> Data -> EF), asp.net, работающий непосредственно с EF, здесь мы не можем делать, по причинам модульности.

EDIT:

Я сдаюсь идею использования AutoMapper, чтобы сделать эту работу =/У меня нет много сущностей, и эти изменения мне нужно сделать в этой библиотеке, чтобы для работы требуется некоторое усилие, это не что-то тривиальное. Лучше сделать картографирование самостоятельно.

ответ

1

Я предполагаю, что ваш объект User имеет свойство Area, которое также может использоваться для установления взаимосвязи между объектами. Вместо того, чтобы установить Area.Users равным новому списку, после создания объекта области просто установите User.Area, равный новой области. Вот как я обрабатываю ассоциирование новых объектов, и он работает надежно.

EDIT

Если я понимаю, что вы делаете, вы создаете бизнес-объекты (BOS), которые позже создают объекты сущностей (ЕО) и крепят этот ЭОС контекста и сохранить их.

Предполагая, что у меня есть основы правильные, для определения точной причины вашей проблемы требуется просмотр кода о том, как соответствующие ОР создадут ОР и присоединяют их к контексту.

+0

Это отношение ко многим ко многим. Это что-то меняет? –

+0

В этом случае попробуйте выполнить логическую функцию Users.Add (user) или user.Areas.Add (Area). –

0

Мое предположение (и это только предположение), что AutoMapper не делает разрешение

идентичности Так что, когда он видит один и тот же объект (пользователь) в различных местах, в графе создает новый объект, а не повторно используя созданный ранее объект.

Это, вероятно, объяснит, что вы видите.

Alex

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