Использование подхода 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; }
}
Здесь следует отметить:
DbObject
имеет только свойство навигации, но не столбец с внешним ключомDbObjectProperty
имеет свойство навигации и соответствующий столбец с внешним ключом- Должно быть очевидно, что если я удаляю объект, я хочу, чтобы его свойства сохранялись вместе с ним, но если я удаляю одно свойство, я не хочу, чтобы весь объект исчезал.
В методе OnModelCreating
для контекста БД до сих пор у меня было следующее для определения отношения:
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");
Я обеспокоен тем, что это, по-видимому, означает, что удаление свойства приведет к удалению связанного с ним объекта. Будет ли он?