2016-05-10 4 views
0

ich request von db von Id erhalten: Request originalRequest = RequestRepository.GetById(id);Löschen Objekt von Einheit mit Beziehung Eins-zu-viele

Dann von I erhalten die Nutzer-IDs Anfrage Kommentare:

var origRecipientsIds = originalRequest.Comments.Select(c => c.User.Id).ToList(); 

und von Eingabemodell I erhalten neue Benutzer (ids)

var editedRecipientsIds = model.Recipients.ToList(); 

und entfernen Sie dann Kommentare von User Ids:

var recipientsIdToRemove = origRecipientsIds.Where(x => !editedRecipientsIds.Contains(x)); 
var recipientsToRemove = GetRecipientsToRemove(originalRequest, recipientsIdToRemove); 
recipientsToRemove.ToList().ForEach(x => originalRequest.Comments.Remove(x)); 

GetRecipientsToRemove Methode gibt Sammlung von RequestComment ‚s

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; 
     } 

Nachdem alle, dass ich SaveChanges Methode

RequestRepository.Context.Entry(originalRequest).State = EntityState.Modified; 
      RequestRepository.SaveChanges(); 

nennen und erhalten Fehler

Die Beziehung nicht da geändert werden Eine oder mehrere Fremdschlüsseleigenschaften sind nicht nullfähig. Wenn eine Änderung an einer Beziehung vorgenommen wird, wird die zugehörige Fremdschlüsseleigenschaft auf einen Nullwert festgelegt. Wenn der Fremdschlüssel keine Nullwerte unterstützt, muss eine neue Beziehung definiert werden, der Fremdschlüsseleigenschaft muss ein anderer Wert ungleich Null zugewiesen werden, oder das nicht verwandte Objekt muss gelöscht werden.

Entity RequestComment hat Nicht-Nullable FK Request

public class RequestComment : IIdent 
    { 
     [ForeignKey("Request")] 
     public int RequestId { get; set; } 
     ... 
    } 

Ich habe versucht, wieder zu bekommen requestComment von db, markieren Sie ihn als Deleted und Save, aber das hilft nicht.

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

Ändern 'public int RequestId {get; einstellen; } 'zu' public int? RequestId {erhalten; einstellen; } '. Setzen Sie das Löschverhalten auf 'Cascade', damit die EF die zugehörigen Einträge in den anderen Tabellen löscht. – aff

+0

@flechilla, danke für deinen Kommentar. Aber gibt es eine andere Lösung, die keine Veränderung der Entität erfordert? – demo

+0

Haben Sie versucht, das Löschverhalten im Kontext zu Cascade zu ändern? EF sollte sich darum kümmern. Wenn nicht, sollten Sie zuerst die zugehörigen Zeilen löschen, die Sie in den anderen Tabellen löschen. – aff

Antwort

0

Es scheint, dass es zwischen den Entitäten in Ihrem Träger DBMS, die Sie nicht lösen werden vor dem Löschen Empfängereinheiten eine Fremdschlüsselbeziehung ist. Es ist möglicherweise zwischen Kommentarinstanzen und Empfängerinstanzen.

Stellen Sie sicher, dass Sie die Abhängigkeiten Ihrer Datenbank verstehen. Löschen Sie zuerst die unabhängigen Instanzen.

+0

Unabhängige Entität ist "RequestComment". Hier ist ein Beweis, ich denke http://imageshack.com/i/pl3FnH2vp (Screenshot aus db-Abhängigkeiten) – demo

+0

Sie erwähnten 'GetRecipientsToRemove' gibt' Comment'-Instanzen zurück, aber es gibt 'RequestComment'-Instanzen zurück. Sind "RequestComment" und "Comment" verschiedene Entitäten? Gibt es 'Comment' überhaupt? –

+0

'Comment' ist 'RequestComment' mein schlechter als – demo

Verwandte Themen