Как сделать так, чтобы отношения были обязательными в коде EF - PullRequest
1 голос
/ 22 ноября 2011

У меня есть отношение E-Code First One-ко-многим. По сути, это отношения между родителем и ребенком, поскольку ребенок не может существовать без родителя.

public class Parent
{
    [Key]
    public Guid Id { get; set; }

    public virtual ICollection<Child> Children { get; set; }

    public virtual ICollection<OtherChild> OtherChildren { get; set; }
}

public class Child
{
    [Key]
    public Guid Id { get; set; }

    public virtual Parent Parent { get; set; }
}

Так что я не был уверен, как заставить ребенка иметь родителя, поэтому я попытался добавить в него атрибут [Обязательный]. Это дало мне ошибку:

- InnerException {"Introducing FOREIGN KEY constraint 'Child_Parent' on table 'Child'
  may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE
  NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint.
  See previous errors."}
  System.Exception {System.Data.SqlClient.SqlException}

Хорошо, я не уверен, как он мог иметь несколько каскадных частей.

Родитель также имеет другие дочерние объекты, и эти дочерние объекты имеют отношение многие-ко-многим с исходным дочерним объектом, но для него не требуется каскадное удаление.

Полагаю, я делаю это неправильно, но как правильно это сделать.

PS. Если у меня есть ребенок, требующий родителя, должен ли я сделать внешний ключ частью первичного ключа?

1 Ответ

2 голосов
/ 23 ноября 2011

Вы можете отключить каскадное удаление для отношения в Fluent API (это невозможно с аннотациями данных):

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>()
            .HasMany(p => p.Children)
            .WithRequired(c => c.Parent)
            .WillCascadeOnDelete(false);
    }
}

Вы также должны удалить потомков в своем коде, если удаляете родителя.

Вам не нужно включать внешний ключ в первичный ключ, и я не вижу в этом никакой выгоды. Ваш ключ Guid уже уникален. Это поможет повысить производительность запросов, если вы создадите индекс для столбца внешнего ключа в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...