Код EF4.1 первый: как отключить каскад удаления для отношения без свойства навигации в зависимом объекте - PullRequest
16 голосов
/ 04 февраля 2012

Допустим, у меня есть эти две очень простые сущности:

public class ParentEntity
{
   public int Id;
   public virtual ICollection<ChildEntity> Childrens;
}

public class ChildEntity
{
   public int Id;
   public int ParentEntityId; // Foreign Key
   public virtual ParentEntity parent; // [NOTWANTED]
}

По некоторым причинам я не хочу, чтобы ChildEntity содержала ссылку на своего родителя.Я просто хочу сохранить идентификатор ParentEntity, но не более того.До сих пор проблем не было, я просто удаляю строку [NOTWANTED], и все работает как положено.

Моя проблема здесь: как отключить каскадное удаление в этом конкретном случае?

Если бы у меня все еще было родительское свойство навигации, это было бы так просто:

modelBuilder.Entity<ChildEntity>()
    .HasRequired(c => c.parent)
    .WithMany(p => p.Childrens)
    .WillCascadeOndelete(false)

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

Что я сделал сейчас, так это установил внешний ключ как обнуляемый тип int, чтобы отключить каскад при удалении, но это не очень красиво:

public int? ParentEntityId; // Foreign Key - nullable just to disable cascade on delete

Как мне заставить его работать с свободным API?Думаю, это должно быть возможно.

1 Ответ

18 голосов
/ 04 февраля 2012

Вы должны настроить его с другой стороны ассоциации:

modelBuilder.Entity<ParentEntity>()
    .HasMany(p => p.Children)
    .WithRequired()
    .HasForeignKey(c => c.ParentEntityId)
    .WillCascadeOnDelete(false);
...