У меня есть этот тест в моей тестовой базе:Почему 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, чтобы сделать эту работу =/У меня нет много сущностей, и эти изменения мне нужно сделать в этой библиотеке, чтобы для работы требуется некоторое усилие, это не что-то тривиальное. Лучше сделать картографирование самостоятельно.
Это отношение ко многим ко многим. Это что-то меняет? –
В этом случае попробуйте выполнить логическую функцию Users.Add (user) или user.Areas.Add (Area). –