我有一个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令人困惑。 –