У меня два объекта:
public class Header
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id {get;set;}
public string RefNo { get; set; }
public decimal TotalAmount { get; set; }
public ICollection<Detail> Detail { get; set; }
}
public class Detail
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id {get;set;}
public int HeaderId { get; set; }
public decimal Amount { get; set; }
public int? ParentDetailId { get; set; }
public virtual Detail ParentDetail { get; set; }
public virtual ICollection<Detail> ChlidDetail { get; set; }
}
Если есть один заголовок и несколько деталей без дочерних деталей, он работает нормально, но при попытке вставить ChildDetail
я получаю сообщение об ошибке.
Вот как я пытаюсь вставить:
Header hdr = new Header();
hdr.RefNo = "Test";
hdr.TotalAmount = Convert.ToDecimal(5.3);
hdr.Detail = new List<Detail>();
hdr.Detail.Add(new Detail
{
HeaderId = hdr.Id,
Amount = 50,
ParentDetail = null,
ChlidDetail = new List<Detail>()
});
foreach(var dtl in hdr.Detail)
{
dtl.ChlidDetail.Add(new Detail { HeaderId = hdr.Id, Amount = 25, ParentDetailId = dtl.Id });
}
После добавления всех сущностей, называемых context.SaveChanges()
, я получаю сообщение об ошибке:
Конфликт оператора MERGE с ограничением FOREIGN KEY "FK_Detail_Header_HeaderId". Конфликт произошел в базе данных «XXXX», таблица «dbo.Header», столбец «Id»
Вот как там контекстный код (с использованием шаблона репозитория)
вот фрагмент кода контекстного слоя
internal readonly ApiContext context;
internal DbSet<T> entities;
string errorMessage = string.Empty;
public Repository(ApiContext context)
{
this.context = context;
entities = context.Set<T>();
}
public T Insert(T entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
entities.Add(entity);
context.SaveChanges();
return entity;
}