1

數據庫記錄讓我們假設我有我的生成表以下類別:刪除與EF6

public class Car 
{ 
    public Guid Id { get; set; } 
    public Guid OwnerId { get; set; } 
    public string Color { get; set; } 

    public virtual Owner Owner { get; set; } 
} 


public class Owner 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    public ICollection<Car> Cars { get; set; } 
} 

在我的DbContext類我創建除去汽車的方法。我想知道什麼是以下兩種方法之間的差異,如果它的事項哪種方法我用:

方法1:

public class CarDbContext : DbContext 
{ 
    public DbSet<Car> Car { get; set; } 
    public DbSet<Ownerr> Owner { get; set; } 

    public CarDbContext(string cs) : base (cs) {} 

    public void RemoveCar(Car car) 
    { 
     Car.Attach(car); 
     Car.Remove(car); 
     SaveChanges(); 
    } 
} 

方法2:

public class CarDbContext : DbContext 
{ 
    public DbSet<Car> Car { get; set; } 
    public DbSet<Ownerr> Owner { get; set; } 

    public CarDbContext(string cs) : base (cs) {} 

    public void RemoveCar(Car car) 
    { 
     Entry(car).State = EntityState.Deleted; 
     SaveChanges(); 
    } 
} 

如果我現在想要刪除所有者,因爲汽車是依賴的,我現在使用的方法會是什麼?

回答

1

就是以下兩種方法之間的差異,如果它的事項哪種方法我用

假設你實際上是用類似於你有什麼上面使用的代碼,沒有太大的區別因爲你立即儲蓄,你沒有任何家屬,但我相信你仍然可能想知道未來會有什麼不同。

方法1:連接,刪除,保存

當刪除()被調用時,EF將停止更改跟蹤,標記爲刪除你的實體,並做一些額外的工作,任何有關的實體和關係。

方法2:標記爲刪除

爲刪除你的實體標記。當調用SaveChanges()時,EF會生成並執行刪除查詢。假設沒有外鍵違規事件發生,記錄就沒有了。我不相信上面提到的額外工作已經完成,但我不記得。

如果我現在想要刪除所有者,既然汽車是依賴的,那麼我現在使用的方法會怎樣?

對於這部分的問題,this答案解釋了不同的方法很好,並可以提供我已經解釋的額外說明。

+0

爲了澄清,如果我調用'Owner.Remove(owner)'代碼會崩潰,因爲Car表中有一個記錄取決於該所有者。如果我調用Entry(所有者).State = EntityState.Deleted;'那麼所有者將被刪除,並且在車表中現在沒有所有者的孤兒記錄。它是否正確?我基於你所提供的鏈接所閱讀的內容。 – Bojan

+0

這完全取決於您的數據庫密鑰的設置方式以及您的實體如何配置。 Remove()不太可能拋出異常,因爲它應該通過刪除它們或清空外鍵來照顧子實體,而EntityState.Deleted將導致數據庫拋出異常 –

+0

您最好的選擇是設置一個沙箱您的上下文指向SQL的本地實例,並嘗試使用每種方法來驗證行爲 –