2 простых класса и ItemDto
:
public class Item
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id {get;set;}
public string name {get;set;}
public Category cat {get;set;}
}
public class Category
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id {get;set;}
public string Name {get;set;}
}
public class ItemDto
{
public int Id {get;set;}
public string name {get;set;}
public int CategoryId {get;set;}
public string CategoryName {get;set;}
}
Профиль отображения:
CreateMap<ItemDto, Item>()
.ForPath(dest => dest.Category.Id, opt => opt.MapFrom(src => src.CategoryId))
.ForPath(dest => dest.Category.Name, opt => opt.MapFrom(src => src.CategoryName));
Вставка или обновление Entity Framework:
public void UploadOrInsert(ItemDto dto)
{
var item =_db.Items.Include(x=>x.Category)
.FirstOrDefault(x => x.Id == dto.Id) ?? new Item();
bool isNew = false;
if (item.Id == 0)
isNew = true;
_mapper.Map<ItemDto, Item>(dto, item);
if (isNew)
_db.Items.Add(item);
}
Вставка 2 различныхitemdtos с той же категорией в базе данных:
{ Id = 1, name = "Itemname1", CategoryId = 1, CategoryName = "CatName1" }
{ Id = 2, name = "Itemname2", CategoryId = 1, CategoryName = "CatName1" }
Первая может быть вставлена корректно с 2 записями: item + 1 и category + 1, выдается следующее исключение при попытке вставить второй itemdto:
SqlException: нарушение ограничения PRIMARY KEY 'PK_Categories'.Невозможно вставить повторяющийся ключ в объект 'dbo.Categories'.Значение ключа-дубликата: (1).
Похоже, что второй dto пытается вставить ту же категорию, которая уже есть в базе данных. Есть ли способ предотвратить это в AutoMapper?