2017-02-16 4 views
1

私はこれと同様のモデルいる:エンティティのプロパティが同じエンティティを参照する場合、エンティティを削除するにはどうすればよいですか?

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が異なるStopsを持っている、しかし、多くのStopsは同じOwnerを持つことができます。

次のように私はIncludeを使用して完全なLineエンティティをロード:

上記を使用して
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); 
} 

私はこのケースでは同じであるLineエンティティ、そのStopsエンティティとそのOwnersを読み込むことができます。しかし

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

、私は例外を取得::私は私が行うLineエンティティを削除しようとすると、今

タイプ「所有者」の実体を取り付けるには、別の実体ために失敗しました同じ型はすでに同じ主キー値を持っています。これは、「Attach」メソッドを使用するか、またはグラフ内のエンティティのいずれかが競合するキー値を持つ場合、エンティティの状態を「Unchanged」または「Modified」に設定すると発生します。これは、一部のエンティティが新しく、データベース生成キー値をまだ受け取っていないことが原因です。この場合、 'Add'メソッドまたは 'Added'エンティティ状態を使用してグラフを追跡し、非新規エンティティの状態を 'Unchanged'または 'Modified'に適切に設定します。

これは、両方ともStopsが同じOwnerを持っていることが原因であると想定しています。ただし、Ownerは同じエンティティではなく、LineをロードするときにはStopごとに独立して作成される2つのエンティティです。

この場合、Lineエンティティを削除するにはどうすればよいですか?

+0

[link](http://stackoverflow.com/questions/30350058/attaching-an-entity-of-type-x-failed-because-another-entity-of-the-ame-type)助けてください。エンティティがコンテキストからロードされている場合、エンティティをアタッチしないでください。 – Sarang

+0

@Sarang 'AsNoTracking()'を使用しているため、エンティティはデタッチされています。 –

答えて

0

はあなただけのエンティティを削除したい場合は、 )新しいオブジェクトを作成することができます
2)は、そのIDプロパティ
3)
4を、それを添付)のような、それは

何かを削除を設定します:

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

レコードを削除するだけで設定するIDが必要です、この方法は、おそらくあなたの問題をバイパスします

+0

私はEFをスキップして、削除のために 'IDbConnection'と' IDbTransaction'を使いますが、この回避策も同様に動作します。 –

関連する問題