У меня есть простое отношение 1: много совокупностей, скажем:
public class Parent
{
public string Name {get; set;}
public Child SelectedChild {get; set;}
public Child PublishedChild {get; set;}
public virtual ICollection<Child> AllChildren {get; set;}
}
public class Child
{
public string Name {get; set;}
[Required]
public Parent Father {get; set;}
}
При создании схемы из этой модели я получаю ошибку:
Введение ограничения FOREIGN KEY 'Parent_SelectedChild' в таблицу 'Parent' может привести к возникновению циклов или нескольких каскадных путей.
Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION или измените другие ограничения FOREIGN KEY
Поэтому я добавляю следующее в OnModelCreating:
modelBuilder.Entity<Child>()
.HasRequired(v => v.Parent)
.WithOptional(c => c.SelectedChild)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Child>()
.HasRequired(v => v.Parent)
.WithOptional(c => c.PublishedChild)
.WillCascadeOnDelete(false);
Это обходит исходную ошибку, но теперь я получаю:
Невозможно определить основной конец отношения 'xxx.Parent_SelectedChild'.
Несколько добавленных объектов могут иметь один и тот же первичный ключ.
Кто-нибудь может помочь?
Все, что я, по сути, хочу сделать, - это сослаться на конкретные дочерние записи в отношении совокупности 1: многие от родителя. Я предполагаю, что EF создаст столбцы идентификатора дочернего идентификатора INT для родителя, например, с именем SelectedChild_Id & ОпубликованныйChild_Id (или аналогичный).
Заранее спасибо
-macon
Редактировать: В ответ на @Slauma:
Я могу получить схему, созданную с помощью:
modelBuilder.Entity<Parent>()
.HasOptional(p => p.SelectedChild)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Parent>()
.HasOptional(p => p.PublishedChild)
.WithOptionalPrincipal()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Parent>()
.HasMany(p => p.AllChildren)
.WithRequired(c => c.Father)
.WillCascadeOnDelete(false);
Но это генерирует несколько FK в записи Child, например Parent_Id, Parent_Id1. Я просто хочу ссылку от родителя на одну из дочерних строк, например, Parent_SelectedChildId. Нужно ли делать это вручную с помощью столбца int на родительском элементе?