2017-02-16 96 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,其在這種情況下是一樣的。

現在,當我試圖刪除Line實體我做的:

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

不過,我得到異常:

附加型「所有者」的實體失敗,因爲另一個實體相同類型已具有相同的主鍵值。如果圖中的任何實體具有衝突的鍵值,則使用「附加」方法或將實體的狀態設置爲「未更改」或「已修改」時可能會發生這種情況。這可能是因爲一些實體是新的並且還沒有收到數據庫生成的關鍵值。在這種情況下,使用'Add'方法或'Added'實體狀態來跟蹤圖形,然後根據情況將非新實體的狀態設置爲'Unchanged'或'Modified'。

我假設這是因爲Stops都有相同的Owner。但是,當加載Line時,Owner不是相同的實體,而是每個Stop獨立創建的2個實體。

如何在這種情況下刪除Line實體?

+0

檢查此[鏈接](http://stackoverflow.com/questions/30350058/attaching-an-entity-of-type-x-failed-because-another-entity-of-the-same-type)幫助。如果實體從上下文加載,則不要附加它。 – Sarang

+0

@Sarang實體被分離,因爲我使用了'AsNoTracking()'。 –

回答

0

如果你只是想刪除一個實體可以

1)創建一個新的對象
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'進行刪除,但是這種解決方法同樣適用。 –