WithOptionalDependent vs WithOptionalPrinciple - Réponse Définitive?
J'ai pensé qu'il pourrait être utile d'obtenir une réponse définitive sur l'utilisation WithOptionalDependent
et quand utiliser WithOptionalPrincipal
. L'aide pour les deux fonctions est un peu moins clair, et je me retrouve à creuser par le biais de multiples Débordement de la Pile des réponses et des réponses sur d'autres sites en combinant les réponses afin de se sentir confiant, j'ai eu la relation de couple dans la direction correcte.
Voici ce que MSDN dit à propos de WithOptionalDependent
:
Configure la relation pour être en option:en option sans
propriété de navigation de l'autre côté de la relation. L'entité
type de configuration seront dépendantes et contenir une clé étrangère
pour le principal. Le type d'entité que la relation cibles
être le principal dans la relation.
et voici ce qu'il dit à propos de WithOptionalPrincipal
:
Configure la relation pour être en option:en option sans
propriété de navigation de l'autre côté de la relation. L'entité
type de configuration sera le principal dans la relation. L'
le type d'entité que la relation cibles seront dépendantes et
contient une clé étrangère vers le principal.
La ligne "Le type d'entité en cours de configuration" est la partie qui toujours me confond (et je suppose que d'autres).
Dans cet exemple:
class MyEntityA
{
[Key]
public int Id { get; set; }
public int BId { get; set; }
[ForeignKey("BId")]
public MyEntityB B { get; set; }
}
class MyEntityB
{
[Key]
public int Id { get; set; }
}
modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent();
est "Le type d'entité en cours de configuration", se référant à MyEntityA
ou MyEntityB
? Je suppose que c'est l'ancien.
Si c'est correct, ce qui est un exemple de cas où vous l'auriez WithOptionalPrincipal
?
En fait je pense que dans mon exemple de code, cela devrait vraiment être WithMany
et ni de la WithOptional options. Clairement, je suis toujours confus!
Il y a des surcharges pour ces deux fonctions prennent la propriété de navigation dans l'autre direction. Je suppose que ces surcharges de ne pas modifier ces réponses, mais s'il vous plaît corrigez-moi si je me trompe.
J'espère que ce sera utile à la communauté en tant que bien.
Vous devez vous connecter pour publier un commentaire.
Par exemple, vous permet de modifier votre
EntityB
par la navigation de la propriété et de faireBId
nullable (comme nous parlons de l'option de la relation).ensuite, nous pouvons utiliser:
MyEntityA
aFK
àMyEntityB
, donc dans votre exemple, vous configurezMyEntityA
et l'utilisation WithOptionalDependent. Mais vous pouvez commencer la configuration deMyEntityB
côté, alors vous avez besoin WithOptionalPrincipal.La réponse à votre question est: "Le type d'entité en cours de configuration" est
MyEntityA
Cela peut être vu définitivement en regardant le la documentation pour
qui est le type retourné par
HasOptional
et qui dit:qui fournit le plus de contexte pour les phrases:
Donc, dans votre cas, vous obtenez de retour de
HasOptional
unAinsi,
WithOptionalDependent
signifie queMyEntityB
sera le Principal avec une facultatif Propriété de Navigation pointant versMyEntityA
(spécifiée par la surcharge du paramètre lambda) etMyEntityA
seront Dépendantes et contenir une Clé Étrangère et la Propriété de Navigation (comme spécifié dans le paramètre lambda deHasOptional
). C'est le scénario dans votre modèle.À l'inverse,
WithOptionalPrincipal
signifie queMyEntityA
sera le Principal etMyEntityB
Dépendante avec des Clés Étrangères et de la Navigation de la Propriété.