public class Foo
{
public string FooId{get;set;}
public Boo Boo{get;set;}
}
public class Boo
{
public string BooId{get;set;}
public Foo Foo{get;set;}
}
Я пытался сделать это в Entity Framework, когда я получил ошибку:
Невозможно определить основной конец ассоциации между типами «ConsoleApplication5.Boo» и «ConsoleApplication5.Foo». Основной конец этой ассоциации должен быть явно сконфигурирован с использованием API свободного взаимодействия или аннотаций данных.
Я видел вопросы о StackOverflow с решением этой ошибки, но я хочу понять, что означает термин «основной конец».
c#
entity-framework
database-design
foreign-key-relationship
Тахер Чабравала
источник
источник
Ответы:
В отношении «один к одному» один конец должен быть основным, а второй конец должен быть зависимым. Основной конец - это тот, который будет вставлен первым и может существовать без зависимого. Зависимый конец - тот, который должен быть вставлен после принципала, потому что у него есть внешний ключ к принципалу.
В случае фреймворка сущности FK также должен быть его PK, поэтому в вашем случае вы должны использовать:
Или беглое отображение
источник
Foo
это основной?Boo
зависимый, требует aFoo
и получает внешний ключ.Foo
является основным и может существовать безBoo
.Вы также можете использовать
[Required]
атрибут аннотации данных, чтобы решить это:Foo
требуется дляBoo
.источник
Boo
что извлеченную из базы данных информацию, если только вы сначала не запустите отложенную загрузкуFoo
свойства. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
быть виртуальным тогда?Это со ссылкой на ответ @Ladislav Mrnka об использовании свободного API для настройки отношений один-к-одному.
Была ситуация, когда не
FK of dependent must be it's PK
было возможности.Например,
Foo
уже имеет отношения один-ко-многимBar
.Теперь нам пришлось добавить еще одно отношение один к одному между Фу и Баром.
Вот как определить отношение один-к-одному, используя свободный API:
Обратите внимание, что при добавлении
PrimaryBarId
необходимо удалить, так как мы указываем его через свободный API.Также обратите внимание, что название метода
[WithOptionalPrincipal()][1]
довольно иронично. В этом случае Принципал - Бар. Описание WithOptionalDependent () в msdn делает его более понятным.источник
PrimaryBarId
собственность? Это смешно для меня. Если я добавлю свойство и скажу, что это внешний ключ, я получу ошибку. Но если у меня нет собственности, то EF все равно ее создаст. Какая разница?PrimayBarId
свойство вFoo
объекте. Скорее всего, то же решение, которое вы пробовали. Ограничения в EF возможно?