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;}
}
J'essayais de le faire dans Entity Framework lorsque j'ai eu l'erreur:
Impossible de déterminer la fin principale d'une association entre les types «ConsoleApplication5.Boo» et «ConsoleApplication5.Foo». L'extrémité principale de cette association doit être explicitement configurée à l'aide de l'API fluide de la relation ou des annotations de données.
J'ai vu des questions sur StackOverflow avec une solution à cette erreur, mais je veux comprendre ce que signifie le terme "extrémité principale".
c#
entity-framework
database-design
foreign-key-relationship
taher chhabrawala
la source
la source
Réponses:
Dans une relation un à un, une extrémité doit être principale et la deuxième extrémité doit être dépendante. L'extrémité principale est celle qui sera insérée en premier et qui peut exister sans celle dépendante. La fin dépendante est celle qui doit être insérée après le principal car elle a une clé étrangère au principal.
Dans le cas d'un framework d'entité, FK en dépend doit également être son PK, donc dans votre cas, vous devez utiliser:
Ou cartographie courante
la source
Foo
c'est le principal alors?Boo
est la personne à charge, nécessite unFoo
et obtient la clé étrangère.Foo
est le principal et peut exister sansBoo
.Vous pouvez également utiliser l'
[Required]
attribut d'annotation de données pour résoudre ce problème:Foo
est requis pourBoo
.la source
Boo
que vous venez de récupérer de la base de données, sauf si vous déclenchez d'abord le chargement différé de laFoo
propriété. entityframework.codeplex.com/SourceControl/network/forks/…Boo Boo
être virtuel alors?Ceci fait référence à la réponse de @Ladislav Mrnka sur l'utilisation d'une API fluide pour configurer la relation un-à-un.
Eu une situation où avoir
FK of dependent must be it's PK
n'était pas possible.Par exemple,
Foo
déjà une relation un-à-plusieurs avecBar
.Maintenant, nous devions ajouter une autre relation un à un entre Foo et Bar.
Voici comment spécifier une relation un-à-un à l'aide d'une API fluide:
Notez que tout en ajoutant
PrimaryBarId
doit être supprimé, comme nous le spécifions via une API fluide.Notez également que le nom de la méthode
[WithOptionalPrincipal()][1]
est assez ironique. Dans ce cas, le principal est Bar. La description de WithOptionalDependent () sur msdn le rend plus clair.la source
PrimaryBarId
propriété? C'est ridicule pour moi. Si j'ajoute la propriété et dis que c'est la clé étrangère, j'obtiens une erreur. Mais si je n'ai pas la propriété, EF la créera quand même. Quelle est la différence?PrimayBarId
propriété dans l'Foo
entité. Probablement la même solution que vous avez essayée. Des limitations dans EF peut-être?