EF Premier Code de clé étrangère sans système de navigation de la propriété
Disons que j'ai les entités suivantes:
public class Parent
{
public int Id { get; set; }
}
public class Child
{
public int Id { get; set; }
public int ParentId { get; set; }
}
Qu'est-ce que le premier code API fluent syntaxe pour faire valoir ce que de ParentId est créé dans la base de données avec une contrainte de clé étrangère pour les Parents de table, sans la nécessité d'avoir une propriété de navigation?
Je sais que si j'ajoute une propriété de navigation Parent à l'Enfant, alors je peux le faire:
modelBuilder.Entity<Child>()
.HasRequired<Parent>(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
Mais je ne veux pas la propriété de navigation dans ce cas particulier.
- Je ne pense pas que ce soit réellement possible juste avec EF, vous aurez probablement besoin d'utiliser certains SQL brut dans un manuel de migration pour le configurer
- qu'est ce que je craignais. Si vous faites que de la réponse, je serai heureux de l'accepter, en supposant que cela est correct. 🙂
- Est-il une raison particulière pour ne pas avoir la propriété de navigation? Seraient la propriété de navigation privée de travailler pour vous - ne serait pas visible à l'extérieur de l'entité, mais s'il vous plaît EF. (Remarque je n'ai pas essayé mais je pense que cela devrait prendre un coup d'oeil à ce post sur le mappage des propriétés privées romiller.com/2012/10/01/...)
- Eh bien, je ne veux pas parce que je n'en ai pas besoin. Je n'aime pas avoir à mettre de l'inutile dans une conception juste pour satisfaire les exigences d'un cadre. Serait-il me tuer pour mettre dans la nav prop? Pas de. En fait, c'est ce que j'ai fait pour le moment.
- Vous avez toujours besoin d'une propriété de navigation sur au moins un côté pour construire une relation. Pour plus d'informations stackoverflow.com/a/7105288/105445
Vous devez vous connecter pour publier un commentaire.
Avec EF Premier Code API Fluent, c'est impossible. Vous avez toujours besoin d'au moins une propriété de navigation pour créer une contrainte de clé étrangère dans la base de données.
Si vous utilisez le Code des Premières Migrations vous avez la possibilité d'ajouter un nouveau code en fonction de la migration sur le gestionnaire de paquets de la console (
add-migration SomeNewSchemaName
). Si vous avez changé quelque chose à votre modèle ou le mappage d'une nouvelle migration sera ajouté. Si vous n'avez pas à changer quoi que ce soit de la force d'une nouvelle migration en utilisantadd-migration -IgnoreChanges SomeNewSchemaName
. La migration ne contiennent videUp
etDown
méthodes dans ce cas.Ensuite vous pouvez modifier la
Up
méthode en ajoutant les suivantes: laL'exécution de cette migration (
update-database
sur l'emballage gérer console) va exécuter une instruction SQL similaire à ceci (pour SQL Server):Sinon, sans les migrations, vous pouvez simplement exécuter un pur commande SQL à l'aide de
où
context
est une instance de votre dérivées de la classe de contexte etsql
est juste au-dessus de la commande SQL as string.Être conscient du fait qu'avec tout cet EF a aucune idée de ce que
ParentId
est une clé étrangère qui décrit une relation. EF ne la considérer que comme un ordinaire propriété scalaire. De toute façon tous les ci-dessus est seulement une plus compliqué et plus lent moyen par rapport à l'ouverture, juste un SQL outil de gestion et d'ajouter la contrainte à la main.[ForeignKey("ParentTableName")]
. Qui fera le lien entre la propriété quelle que soit la clé est sur la table parent. Maintenant vous avez un hard-codée nom de la table même si.Bien que ce post est pour
Entity Framework
pasEntity Framework Core
, Il pourrait être utile pour quelqu'un qui veut réaliser la même chose à l'aide de Entity Framework Core (je suis aide V1.1.2).Je n'ai pas besoin propriétés de navigation (même si ils sont gentils) parce que je suis pratiquant DDD et je veux
Parent
etChild
deux agrégats racines. Je veux qu'ils soient capables de parler les uns aux autres par l'intermédiaire de la clé étrangère non pas à travers des infrastructures spécifiquesEntity Framework
les propriétés de navigation.Tout ce que vous avez à faire est de configurer la relation d'un côté à l'aide de
HasOne
etWithMany
sans spécifier les propriétés de navigation (ils ne sont pas là, après tout).Je donne des exemples sur la façon de configurer les propriétés d'entité, mais le plus important ici est
HasOne<>
,WithMany()
etHasForeignKey()
.Espère que cela aide.
HasOne<Parent>()
et.WithMany()
sur cet enfant de configuration. Ils n'ont pas de référence les propriétés de navigation, car il n'y a pas de navigation propriétés définies de toute façon. Je vais essayer de le rendre plus clair avec mes mises à jour.List<int> Children
. Est-il un moyen de la carte ce un-à-plusieurs relation avec cette approche? Sans avoir une liste d'objets Enfants.int
est trop général. Mais j'ai peut-être tort. La seule façon maintenant je peux penser à réaliser ce que vous voulez est de sélectionner l'Id de la part des enfants des objets comme une propriété en lecture seule.Petite astuce pour ceux qui veulent utiliser DataAnotations et ne voulez pas exposer à une Propriété de Navigation - utilisation
protected
C'est ça la clé étrangère avec
cascade:true
aprèsAdd-Migration
sera créé.Parent
ou tout simplementParentId
?private
.En cas de EF Core, vous n'avez pas nécessairement besoin de fournir une propriété de navigation. Vous pouvez simplement fournir une Clé Étrangère sur un côté de la relation. Un exemple simple avec API Fluent: