我有一個SQLite數據庫與實體框架映射。 有2個表格:集合(1:n)專輯。實體框架硬級聯刪除
當我刪除一個集合時,所有相關的專輯也必須被刪除。 我使用CollectionRepo.Delete(collection);
來實現這一點。它使用下面的代碼:
public int Delete(Collection entity)
{
Context.Entry(entity).State = EntityState.Deleted;
return Context.SaveChanges();
}
的問題是:當我執行這個代碼,Context.SaveChanges();
給我一個例外:
操作失敗:關係不能被改變,因爲一個或多個外鍵屬性是不可空的。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。
看來,實體框架想在外鍵上null
而不是刪除條目。但這絕對不是我想要的,因爲沒有父母(至少在我的用例中),專輯沒有意義。
我明顯可以手動刪除相冊,然後刪除空集合,但在我看來有點棘手。首先,在我看來,EF應該足夠聰明,可以自己來簡化代碼;其次,如果我與收藏和專輯有很多關係,那麼我最終會面臨很大的難度,難以維護,代碼庫。
集合類
public class Collection
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public virtual List<Album> Albums { get; set; } = new List<Album>();
}
Album類
public class Album
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
[ForeignKey("Collection")]
public long CollectionId { get; set; }
public virtual Collection Collection { get; set; }
}
的DbContext子類
public class DataEntities : DbContext
{
public virtual DbSet<Collection> Collections { get; set; }
public virtual DbSet<Album> Albums { get; set; }
public DataEntities() : base("name=Connection")
{
Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Album>()
.HasRequired(a => a.Collection)
.WithMany(c => c.Albums)
.HasForeignKey(a => a.CollectionId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<Collection>()
.HasMany(c => c.Albums)
.WithRequired(a => a.Collection)
.WillCascadeOnDelete(true);
}
}
聽起來像它的使用SQLite不支持級聯刪除HTTP的問題://計算器。 com/questions/10719425/foreign-key-constraint-on-delete-cascade-not-working-in-sqlite-database-on-andro –
3.14.2(System.Data.SQLite 1.0.103)。 它似乎並沒有與SQLite恕我直言,因爲我的表中的外鍵允許爲空,加上異常堆棧跟蹤最深的調用是'System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges(SaveOptions選項) '這似乎還沒有與SQLite相關。 –
您在映射[必需] [ForeignKey]中將其指定爲非空,這就是爲什麼EF令人困惑。 –