循环删除以哪种方式进行一对多关系?

Tim*_*mwi 13 .net entity-framework cascading-deletes

使用Entity Framework代码优先方法.

假设我有两个实体类:

[Table("Objects")]
public class DbObject : IValidatableObject
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<DbObjectProperty> Properties { get; set; }
}

[Table("ObjectProperties")]
public class DbObjectProperty
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Value { get; set; }

    [Display(Name = "Object"), UIHint("Object")]
    public long ObjectId { get; set; }
    public virtual DbObject Object { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的地方:

  • DbObject 只有一个导航属性,但没有带外键的列
  • DbObjectProperty具有导航属性具有外键的相应列
  • 很明显,如果我删除一个对象,我希望它的属性与它一起使用,但如果我删除一个属性,我不希望整个对象消失.

OnModelCreatingDB上下文的方法中,到目前为止我有以下内容来定义关系:

modelBuilder.Entity<DbObjectProperty>()
    .HasRequired(op => op.Object)
    .WithMany(obj => obj.Properties)
    .HasForeignKey(op => op.ObjectId)
    .WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)

当然,这意味着不会发生级联删除.我的问题是:如果我改变这个true,那会做我想要的吗?请记住,如果我删除一个对象,我希望它的属性与它一起使用,但是如果我删除一个属性,我不希望整个对象消失.

这一变化(来自自动生成的迁移代码falsetrue)是这样的:

DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");
Run Code Online (Sandbox Code Playgroud)

我担心这似乎暗示删除属性将删除其关联的对象.会吗?

Sla*_*uma 14

级联删除数据库中关系的方向是由主体(主/唯一键的表)以及该关系的从属(外键表)是什么定义的.

然后,如果删除主体,则同时删除具有与该主体的主/唯一键值对应的外键值的所有依赖项.在从依赖到委托的方向上没有级联删除.

在您的情况下,主体是DbObject和依赖是DbObjectProperty因为它是具有外键的实体/表.

以相反的方式进行级联删除很少有意义 - 特别是在x对多关系中:如果删除依赖(DbObjectProperty)并且DbObject自动删除principal(),则会违反外键约束是任何其他依赖指向将被删除的委托人.

你不用担心.