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;}
}
Eu estava tentando fazer isso no Entity Framework quando recebi o erro:
Não foi possível determinar o fim principal de uma associação entre os tipos 'ConsoleApplication5.Boo' e 'ConsoleApplication5.Foo'. A extremidade principal desta associação deve ser explicitamente configurada usando a API fluente do relacionamento ou anotações de dados.
Vi perguntas no StackOverflow com uma solução para esse erro, mas quero entender o significado do termo "fim principal".
c#
entity-framework
database-design
foreign-key-relationship
taher chhabrawala
fonte
fonte
Respostas:
Na relação um para um, um extremo deve ser principal e o segundo extremo deve ser dependente. Extremidade principal é aquela que será inserida primeiro e que pode existir sem a dependente. Extremidade dependente é aquele que deve ser inserido após o principal, porque possui chave estrangeira para o principal.
No caso da estrutura da entidade, o FK em dependente também deve ser o seu PK; portanto, no seu caso, você deve usar:
Ou mapeamento fluente
fonte
Foo
é o principal então?Boo
é o dependente, requer aeFoo
obtém a chave estrangeira.Foo
é o principal e pode existir sem aBoo
.Você também pode usar o
[Required]
atributo de anotação de dados para resolver isso:Foo
é necessário paraBoo
.fonte
Boo
que você acabou de recuperar do banco de dados, a menos que você inicie o carregamento lento daFoo
propriedade. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
então não deveria ser virtual?Isso se refere à resposta de @Ladislav Mrnka sobre o uso de API fluente para configurar o relacionamento individual.
Teve uma situação em que ter
FK of dependent must be it's PK
não era viável.Por exemplo,
Foo
já possui um relacionamento com muitosBar
.Agora, tivemos que adicionar outro relacionamento individual entre Foo e Bar.
Aqui está como especificar o relacionamento individual usando a API fluente:
Observe que a adição
PrimaryBarId
precisa ser removida, pois a especificamos por meio de API fluente.Observe também que o nome do método
[WithOptionalPrincipal()][1]
é meio irônico. Nesse caso, Principal é Bar. A descrição de WithOptionalDependent () no msdn torna mais clara.fonte
PrimaryBarId
propriedade? Isso é ridículo para mim. Se eu adicionar a propriedade e disser que é a chave estrangeira, recebo um erro. Mas se eu não tiver a propriedade, a EF a criará de qualquer maneira. Qual é a diferença?PrimayBarId
propriedade naFoo
entidade. Provavelmente a mesma solução que você tentou. Limitações na EF, talvez?