1

晚安。我有以下關係問題。 我有一個圖片類Imagem如何刪除從EF Code First中的其他實體引用的實體?

public class Imagem : Entity 
{ 
    public long Id {get ; set;} 

    public string Name{ get; set; } 
} 

我建立一個怎樣的一個畫廊,我對gallery的前板的圖像。

public class gallery: Entity 
{ 
    public long Id {get ; set;} 

    public Imagem Frontsheet{ get; set; } 
} 

我最大的問題是,當我刪除的圖像不會離開,因爲 的圖像與庫相關聯。

如何處理這種類型的情況,以便從圖像表中刪除圖像?

+3

抱歉,您的標題讓我發笑。 – Eonasdan

回答

0

如果任何圖庫通過FrontSheet屬性引用該圖像,那麼您在數據庫中有禁止刪除圖像的約束。你需要做的是將這些關係設置爲NULL。 (這種關係似乎是可選的,因此您可以將數據庫中的外鍵設置爲NULL。)使用您的模型,您將不得不選擇所有指向您想要刪除的圖像的圖庫。它應該是這樣的,如果你想刪除使用id = givenImageId圖像:

using (var context = new MyDbContext()) 
{ 
    var imageToDelete = context.Images.Single(i => i.Id == givenImageId); 
    var galleries = context.Galleries.Include("Frontsheet") 
     .Where(g => g.Frontsheet.Id == givenImageId) 
     .ToList(); 

    foreach(var gallery in galleries) 
     gallery.Frontsheet = null; 

    context.Images.Remove(imageToDelete); 

    context.SaveChanges(); 
} 

如果你想對你的Gallery實體的外鍵屬性...

public long? FrontsheetId { get; set; } 

...你將不需要的前板與畫廊一起加載這將提高性能:

using (var context = new MyDbContext()) 
{ 
    var imageToDelete = context.Images.Single(i => i.Id == givenImageId); 
    var galleries = context.Galleries // no Include anymore required 
     .Where(g => g.FrontsheetId == givenImageId) 
     .ToList(); 

    foreach(var gallery in galleries) 
     gallery.FrontsheetId = null; 

    context.Images.Remove(imageToDelete); 

    context.SaveChanges(); 
} 
0

我不知道你們的關係也正是ENTI之間關係,但看起來它是1:1的關係。您需要配置的關係級聯刪除:

modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete(); 

做到這一點的配置在上下文的實體:

public class SomeContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete(); 
    } 
} 

這是假設一個可選的/所需的關係。你也可以做一個必需的/必需的。它還假定您沒有從圖像到圖庫的導航屬性。

如果您發佈了兩個模型的完整代碼,它將會更容易幫助您。

如果您不希望數據庫級聯刪除,則可以在刪除圖庫之前刪除該圖像。

相關問題