Я пытаюсь разработать следующие отношения сущностей
- Программа
- сборка
Программа может иметь несколько сборок. Одна из сборок будет основной сборкой. Каждая сборка принадлежит только одной программе.
Классы моделируются следующим образом:
public class Program
{
public int Id {get;set;}
public virtual ProgramAssembly MainAssembly {get;set;}
public virtual ICollection<ProgramAssembly> Assemblies {get;set;}
}
public class ProgramAssembly
{
public int Id {get;set;}
public virtual Program Program {get;set;}
public int ProgramId {get;set;}
}
Я ничего не указываю с помощью FluentApi (однако я ничего против этого не имею).
В приведенном выше коде я получаю эту ошибку:
Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих связей. Свойство EntityEntries вернет значение null, поскольку один объект не может быть идентифицирован как источник исключения. Обработку исключений при сохранении можно упростить, предоставив свойства внешнего ключа в ваших типах сущностей. Подробнее см. InnerException.
InnerException: невозможно определить допустимый порядок зависимых операций. Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или значений, сгенерированных хранилищем.
Я попытался изменить ProgramAssembly на следующее
public class ProgramAssembly
{
[ForeignKkey("Program")]
public int Id {get;set;}
public virtual Program Program {get;set;}
}
Однако затем я получаю эту ошибку:
ProgramAssembly_Program_Source: : Множественность недопустима в роли «ProgramAssembly_Program_Source» в отношении «ProgramAssembly_Program». Поскольку зависимая роль относится к ключевым свойствам, верхняя граница кратности зависимой роли должна быть равна «1».
Я также попробовал следующий свободный подход API
modelBuilder.Entity<ProgramAssembly>()
.HasRequired(a => a.Program)
.WithMany(p => p.Assemblies);
public class ProgramAssembly
{
public int Id { get; set; }
public virtual Program Program { get; set; }
[ForeignKey("Program")] //same error with or without this attribute
public int ProgramId { get; set; }
}
Тогда ошибка:
Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих связей. Свойство EntityEntries вернет значение null, поскольку один объект не может быть идентифицирован как источник исключения. Обработку исключений при сохранении можно упростить, предоставив свойства внешнего ключа в ваших типах сущностей. Подробности смотрите в InnerException». UpdateException: невозможно определить допустимый порядок зависимых операций. Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или значений, сгенерированных хранилищем.
Как разрешить эту связь без изменения подхода к добавлению атрибута IsPrimary в сборку?
Я видел несколько похожих вопросов на SO, но они были либо о ядре EF, например этот или предложенное существенное изменение логики, например этот или даже этот, который даже не компилируется.
IsPrimary
кAssembly
будет выглядеть лучше, чем наличие двух отношений - person Camilo Terevinto   schedule 30.05.2018program.Assemblies.Single(x => x.IsMain)
(или вы даже можете использовать его как навигационное свойство), но вы правы, что вам нужно будет проверить это при сохранении. Ответ для EF Core должен работать почти так же с использованием Fluent API. Я почти уверен, что вы не можете сделать это через DataAnottations, хотя - person Camilo Terevinto   schedule 30.05.2018ProgramAssembly.Id
для основной сборки иProgramAssembly.ProgramId
для всех остальных сборок. Ты согласен с этим? (Конечно, это звучит ужасно для меня) - person Camilo Terevinto   schedule 30.05.2018