我得到request
從數據庫中通過編號:Request originalRequest = RequestRepository.GetById(id);
從實體刪除對象與關係的一個一對多
然後我得到用戶的ID從請求評論:
var origRecipientsIds = originalRequest.Comments.Select(c => c.User.Id).ToList();
,並從輸入模型接收新用戶(IDS)
var editedRecipientsIds = model.Recipients.ToList();
,然後刪除通過用戶ID的評論:
var recipientsIdToRemove = origRecipientsIds.Where(x => !editedRecipientsIds.Contains(x));
var recipientsToRemove = GetRecipientsToRemove(originalRequest, recipientsIdToRemove);
recipientsToRemove.ToList().ForEach(x => originalRequest.Comments.Remove(x));
GetRecipientsToRemove
方法返回RequestComment
的
private IEnumerable<RequestComment> GetRecipientsToRemove(Request originalRequest,
IEnumerable<int> recipientsIdsToRemove)
{
var recipientsToRemove = new List<RequestComment>();
foreach (var id in recipientsIdsToRemove)
{
int localId = id;
var origComment = originalRequest.Comments.FirstOrDefault(x => x.User.Id == localId);
if (!recipientsToRemove.Contains(origComment))
{
recipientsToRemove.Add(origComment);
}
}
return recipientsToRemove;
}
收集了這一切後,我打電話SaveChanges
方法
RequestRepository.Context.Entry(originalRequest).State = EntityState.Modified;
RequestRepository.SaveChanges();
,並得到錯誤
的關係,不能因爲改變一個或多個外鍵屬性是不可空的。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。
實體RequestComment
具有非空的FK到Request
public class RequestComment : IIdent
{
[ForeignKey("Request")]
public int RequestId { get; set; }
...
}
我試圖從數據庫獲取再次requestComment
,將其標記爲Deleted
和Save
,但這並不能幫助。
var dbComment = RequestCommentRepository.FindFirstOrDefault(x => x.User.Id == localId
&& x.RequestId == originalRequest.Id);
RequestCommentRepository.Context.Entry(dbComment).State = EntityState.Deleted;
RequestCommentRepository.SaveChanges();
更改'public int RequestId {get;組; }'到'公衆詮釋? RequestId {get;組; }'。還要將刪除行爲設置爲「級聯」,以便EF將刪除其他表中的相關條目。 – aff
@flechilla,謝謝你的評論。但是有沒有其他解決方案不需要更改實體? – demo
您是否嘗試將上下文中的刪除行爲更改爲Cascade。 EF應該爲你照顧。如果不是,你應該首先刪除你在其他表中刪除的相關行。 – aff