2016-05-10 179 views
0

我得到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,將其標記爲DeletedSave,但這並不能幫助。

var dbComment = RequestCommentRepository.FindFirstOrDefault(x => x.User.Id == localId 
                      && x.RequestId == originalRequest.Id); 
RequestCommentRepository.Context.Entry(dbComment).State = EntityState.Deleted; 
RequestCommentRepository.SaveChanges(); 
+0

更改'public int RequestId {get;組; }'到'公衆詮釋? RequestId {get;組; }'。還要將刪除行爲設置爲「級聯」,以便EF將刪除其他表中的相關條目。 – aff

+0

@flechilla,謝謝你的評論。但是有沒有其他解決方案不需要更改實體? – demo

+0

您是否嘗試將上下文中的刪除行爲更改爲Cascade。 EF應該爲你照顧。如果不是,你應該首先刪除你在其他表中刪除的相關行。 – aff

回答

0

看起來您的備份DBMS中的實體之間存在一個外鍵關係,在刪除接收實體之前您沒有解決這個問題。它可能在評論實例和收件人實例之間。

確保您瞭解您的數據庫的依賴關係走哪條路。首先刪除獨立實例。

+0

獨立實體是'RequestComment'。這裏有一些證明我認爲http://imageshack.com/i/pl3FnH2vp(屏蔽掉數據庫依賴) – demo

+0

你提到'GetRecipientsToRemove'返回'Comment'實例,但它返回'RequestComment'實例。 RequestComment和Comment是不同的實體嗎? 「評論」是否存在? –

+0

'評論'是'RequestComment'我的不如 – demo

相關問題