Подтвердить что ты не робот

Каким образом каскадное удаление происходит в отношениях "один ко многим"?

Использование метода 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");

Я обеспокоен тем, что это означает, что удаление свойства приведет к удалению связанного с ним объекта. Будет ли это?

4b9b3361

Ответ 1

Направление каскадного удаления отношения в базе данных определяется тем, что является основным (таблица первичного/уникального ключа) и какова зависимая (таблица внешнего ключа) этого отношения.

Затем, если вы удалите принципала, все иждивенцы, у которых есть значение внешнего ключа, соответствующее первому/уникальному значению ключа этого принципала, также удаляются. Каскадное удаление в направлении от зависимого от принципала отсутствует.

В вашем случае главный DbObject, а зависимый - DbObjectProperty, потому что это сущность/таблица с внешним ключом.

Слишком редко было бы иметь каскадное удаление наоборот - особенно в отношениях x-to-many: если вы удалите зависимый (DbObjectProperty), а главный (DbObject) будет удален автоматически, ограничение внешнего ключа будет нарушено, если есть другие зависимые ссылки на принципала, который будет удален.

Вам не нужно беспокоиться.