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;}
}
Intenté hacer esto en Entity Framework cuando recibí el error:
No se puede determinar el final principal de una asociación entre los tipos 'ConsoleApplication5.Boo' y 'ConsoleApplication5.Foo'. El final principal de esta asociación debe configurarse explícitamente utilizando la API fluida de relación o las anotaciones de datos.
He visto preguntas sobre StackOverflow con una solución para este error, pero quiero entender qué significa el término "fin principal".
c#
entity-framework
database-design
foreign-key-relationship
taher chhabrawala
fuente
fuente
Respuestas:
En una relación uno a uno, un extremo debe ser principal y el segundo extremo debe ser dependiente. El extremo principal es el que se insertará primero y que puede existir sin el dependiente. El final dependiente es el que debe insertarse después del principal porque tiene una clave foránea para el principal.
En el caso del marco de la entidad, FK en dependiente también debe ser su PK, por lo que en su caso debe usar:
O mapeo fluido
fuente
Foo
es el director entonces?Boo
es dependiente, requiere aFoo
y obtiene la clave foránea.Foo
es el principal y puede existir sin aBoo
.También puede usar el
[Required]
atributo de anotación de datos para resolver esto:Foo
se requiere paraBoo
.fuente
Boo
que acaba de recuperar de la base de datos, a menos que primero active la carga diferida de laFoo
propiedad. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
ser virtual entonces?Esto se refiere a la respuesta de @Ladislav Mrnka sobre el uso de una API fluida para configurar la relación uno a uno.
Tuve una situación donde tener
FK of dependent must be it's PK
no era factible tener.Por ejemplo,
Foo
ya tiene una relación de uno a muchosBar
.Ahora, tuvimos que agregar otra relación uno a uno entre Foo y Bar.
Aquí se explica cómo especificar una relación uno a uno utilizando una API fluida:
Tenga en cuenta que si bien la adición
PrimaryBarId
debe eliminarse, ya que lo especificamos a través de una API fluida.También tenga en cuenta que el nombre del método
[WithOptionalPrincipal()][1]
es algo irónico. En este caso, el director es Bar. La descripción de WithOptionalDependent () en msdn lo hace más claro.fuente
PrimaryBarId
propiedad? Esto es ridículo para mí. Si agrego la propiedad y digo que es la clave externa, aparece un error. Pero si no tengo la propiedad, EF la creará de todos modos. ¿Cual es la diferencia?PrimayBarId
propiedad en laFoo
entidad. Probablemente la misma solución que probaste. ¿Limitaciones en EF quizás?