.net 级联删除是以一对多的关系进行的?

.net 级联删除是以一对多的关系进行的?,.net,entity-framework,cascading-deletes,.net,Entity Framework,Cascading Deletes,使用实体框架代码优先的方法 假设我有两个实体类: [Table("Objects")] public class DbObject : IValidatableObject { public long Id { get; set; } public string Name { get; set; } public string Description { get; set; } public virtual ICollection<DbObjectPro

使用实体框架代码优先的方法

假设我有两个实体类:

[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; }
}
当然,这意味着不会发生级联删除。我的问题是:如果我将其更改为
true
,这是否符合我的要求?请记住,如果我删除一个对象,我希望它的属性与之匹配,但如果我删除一个属性,我不希望整个对象消失

此更改的自动生成迁移代码(从
false
true
)如下所示:


我担心这似乎意味着删除属性将删除其关联对象。会吗?

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

然后,如果删除主体,则具有与该主体的主/唯一键值对应的外键值的所有从属项也将被删除。在从从属到主体的方向上没有级联删除

在本例中,主体是
DbObject
,依赖项是
DbObjectProperty
,因为它是带有外键的实体/表

以另一种方式进行级联删除几乎没有意义,尤其是在x-to-many关系中:如果删除依赖(
DbObjectProperty
)并且主体(
DbObject
)将自动删除,如果存在任何其他将要删除的对主体的依赖引用,则会违反外键约束


你不必担心。

经验法则是,使用级联删除时,如果删除一条记录会破坏另一条记录的外键,那么依赖记录也会被删除。因此
modelBuilder.Entity().HasMany(p=>p.Children)。WithOne(c=>c.Parent)
modelBuilder.Entity().HasOne(c=>c.Parent)相同。WithMany(p=>p.Children)
(它们指定了相同的关系)?
modelBuilder.Entity<DbObjectProperty>()
    .HasRequired(op => op.Object)
    .WithMany(obj => obj.Properties)
    .HasForeignKey(op => op.ObjectId)
    .WillCascadeOnDelete(false);
DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");