【发布时间】:2016-06-06 09:30:30
【问题描述】:
在单个 SaveChanges 中尝试(可能做的太多)时出现外键错误。
基本上我有以下 3 个像这样的 poco 实体。
public class ClinicianAvailability
{
public int ClinicianAvailabilityId { get; set; }
}
public class SurgicalBooking
{
public int SurgicalBookingId
public int? ClinicianAvailabilityId { get; set; }
public bool IsAdhoc { get; set; }
public virtual TheatreBooking TheatreBooking { get; set; }
public virtual ClinicianAvailability ClinicianAvailability { get; set; }
}
public class TheatreBooking
{
public int TheatreBookingId {get;set;}
public virtual SurgicalBooking SurgicalBooking { get; set; }
public virtual ClinicianAvailability ClinicianAvailability { get; private set; }
}
我基本上是在尝试删除在 SurgicalBooking 上有外键的 ClinicianAvailability。但同时尝试在 SurgicalBooking 上设置新的 TheatreBooking。
像这样:
var entity = _clinicianAvailabilityRepository.Find(resourceAvailabilityId);
var surgStub = surgicalBookingRepository.CreateStub(bookingData.ScheduleId);
surgStub.IsAdhoc = true;
surgStub.ClinicianAvailabilityId = null;
surgicalBookingRepository.SetModified(surgStub, new Expression<Func<SurgicalBooking, object>>[] { x => x.IsAdhoc, x => x.ClinicianAvailabilityId });
theatreBookingRepository.Add( new TheatreBooking
{
TheatreBooking Id = theatreBookingRepository.GetNewTempKey(),
TheatreId = associatedTheatreId.Value,
SurgicalBooking = surgStub
});
theatreBookingRepository.Add(TheatreBooking);
_clinicianAvailabilityRepository.Remove(entity);
_clinicianAvailabilityRepository.UnitOfWork.SaveChanges();
所以基本上在这样做之后,我在 ClinicianAvailabilityId 的 SurgicalBooking 外键上得到一个外键错误。如果我删除了 TheatreBooking 的添加,它会按照正确的顺序通过更新 Surgical Booking 然后删除。但是在添加剧院预订时,它会先尝试删除,然后失败。有什么帮助吗?我试图尽可能简化这一点,但这有点复杂。我试图不进行多次保存更改或将其全部放在单个事务中,因为更改所有这些代码将需要大量返工。
我查看了 ChangeTracker,所有项目似乎都按正确的顺序排列,但它并没有按那个顺序排列。
【问题讨论】:
-
查看删除顺序,先删除引用外键的表,然后只删除主表数据,查看是否还有外键引用
-
如果孩子附加到上下文中,EF 将为每个附加的孩子生成一个 DELETE 语句,然后为父级(因为 Remove 确实将它们全部标记为已删除)您将在此处获得详细说明 @987654321 @
标签: c# sql .net entity-framework entity-framework-6