2017-02-16 1 views
1

Ich habe Modelle ähnlich wie diese:Wie lösche ich eine Entität, wenn ihre Eigenschaften auf dieselbe Entität verweisen?

public class Line 
{ 
    public int Id {get; set;} 
    public int FromStopId {get; set;} 
    public int ToStopId {get; set;} 
    public virtual Stop FromStop {get; set;}  
    public virtual Stop ToStop {get; set;}  
} 

public class Stop 
{ 
    public int Id {get; set;} 
    public int OwnerId {get; set;} 
    public virtual Owner Owner {get; set;}  
} 

Lines haben unterschiedliche Stops jedoch viele Stops die gleiche Owner haben.

Ich lade ein komplettes LineInclude Einheit wie folgt verwendet:

public virtual IQueryable<T> Get(int id, params Expression<Func<T, object>>[] include) 
{ 
    if (include.Any()) 
    { 
     var set = include.Aggregate<Expression<Func<T, object>>, IQueryable<T>> 
          (dbSet, (current, expression) => current.Include(expression)); 
    } 

    return dbSet.AsNoTracking<T>().Where(x => x.Id == id); 
} 

Unter Verwendung der oben kann ich eine Line Einheit laden, seine Stops Entitäten und deren Owners, die in diesem Fall gleich ist.

Nun, wenn ich versuche, die Line Einheit löschen ich tun:

dbSet.Attach(entity); 
dbSet.Remove(entity); 

Allerdings habe ich die Ausnahme erhalten:

eine Einheit vom Typ ‚Eigentümer‘ Anbringen schlug fehl, da eine andere Einheit von Derselbe Typ hat bereits denselben Primärschlüsselwert. Dies kann passieren, wenn Sie die Methode "Attach" verwenden oder den Status einer Entität auf "Unverändert" oder "Modifiziert" setzen, wenn Entitäten im Diagramm widersprüchliche Schlüsselwerte aufweisen. Dies liegt möglicherweise daran, dass einige Entitäten neu sind und noch keine datenbankgenerierten Schlüsselwerte erhalten haben. In diesem Fall verwenden Sie die "Add" -Methode oder den Entity-Status "Added", um den Graphen zu verfolgen und anschließend den Status von nicht-neuen Entitäten auf "Unchanged" oder "Modified" zu setzen.

Ich gehe davon aus, dass dies, weil beide Stops die gleiche Owner haben verursacht wird. Jedoch ist die nicht die gleiche Entität, sondern 2 Entitäten, die unabhängig für jede Stop beim Laden der Line erstellt werden.

Wie kann ich Line Einheit in einem solchen Fall löschen?

+0

Überprüfen Sie, ob dies [link] (http://stackoverflow.com/questions/30350058/attaching-an-entity-of-type-x-failed-because-another-entity-of-the-same-type) hilft. Wenn die Entity aus dem Kontext geladen wird, hängt sie nicht an. – Sarang

+0

@Sarang Die Entität ist getrennt, da ich 'AsNoTracking()' verwende. –

Antwort

0

Wenn Sie nur ein Objekt löschen möchten, können Sie

1) ein neues Objekt
2) festgelegt seine Id-Eigenschaft
3) Bringen Sie es
4) Löschen Sie es

So etwas wie :

var toDelete= new MyEntity{ Id = 123 }; 
context.MyEntities.Attach(toDelete); 
context.MyEntities.Remove(toDelete); 
context.SaveChanges(); 

Löschen eines Datensatzes nur die Id diese Art und Weise wird wahrscheinlich eingestellt werden müssen, umgehen das Problem

+0

Ich wollte EF überspringen und 'IDbConnection' und' IDbTransaction' für Löschungen verwenden, aber diese Problemumgehung funktioniert genauso gut. –

Verwandte Themen