使用实体框架代码优先方法。
假设我有两个实体类:
[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; }
}
这里要注意的点:
DbObject
只有一个导航属性,但没有带有外键的列DbObjectProperty
有一个导航属性和一个带有外键的对应列- 很明显,如果我删除一个对象,我希望它的属性随之而来,但如果我删除一个属性,我不希望整个对象消失。
在OnModelCreating
DB 上下文的方法中,到目前为止,我有以下定义关系:
modelBuilder.Entity<DbObjectProperty>()
.HasRequired(op => op.Object)
.WithMany(obj => obj.Properties)
.HasForeignKey(op => op.ObjectId)
.WillCascadeOnDelete(false);
当然,这意味着不会发生级联删除。我的问题是:如果我将其更改为true
,那是否符合我的要求?请记住,如果我删除一个对象,我希望它的属性随之而来,但如果我删除一个属性,我不希望整个对象消失。
此更改的自动生成的迁移代码(从false
到true
)是这样的:
DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");
我担心这似乎意味着删除一个属性会删除它的关联对象。会吗?