2010-12-14 15 views
2

Je travaille avec Entity Framework pour la première fois. La base de données avec laquelle je travaille n'a aucune contrainte de clé étrangère définie (et je ne peux pas la changer, l'intégrité est contrôlée au niveau de l'application, hors de mes mains).Entity Framework 4 tables relatives sans contrainte de clé étrangère

Il existe une convention très forte dans la base de données - toutes les PK sont nommées d'une manière spécifique, et un champ FK a exactement le même nom que le PK correspondant.

Lorsque je dessine une relation avec EF, il semble vouloir créer automatiquement un champ FK dans la table enfant. Y a-t-il un moyen d'apprendre à EF à inférer nos relations sur la base de notre convention?

+0

je ne crois pas. EF a besoin de FK pour ses propriétés de navigation. vous devrez peut-être exécuter manuellement les jointures à l'aide de LINQ ou créer des vues et les utiliser. – RPM1984

Répondre

1

Il n'y a rien de intégré à infer FK basé sur des conventions de nommage, mais vous pouvez ajouter manuellement les associations à votre modèle. Les associations ne ont pas besoin d'un sous-jacent FK contrainte de sorte que vous pouvez ajouter les associations au modèle que ...


Mise à jour: Dans la dernière version du Model Comparer for EF4, j'ai ajouté une fonction pour générer et inférer FKs associations dans les modèles EFv4 basées sur des contraintes FK inférées. Blogué à ce sujet ici: http://huagati.blogspot.com/2010/12/inferring-foreign-key-constraints-in.html

J'espère que ça aide ...

+0

Merci - J'ai trouvé que la différence était dans la façon dont je créais les associations. Si je le fais en cliquant avec le bouton droit sur l'entité et en choisissant Ajouter | Association, alors je reçois le comportement indésirable. Mais si j'utilise simplement la boîte à outils pour créer une association en sélectionnant les 2 champs, alors j'obtiens ce que je veux. Ce serait bien si je pouvais le faire d'une manière ou d'une autre (plug-in ou autre), parce que c'est une grande base de données. – JMarsch

+0

Ok, je suis tenté de le prendre. Quelles sont les règles d'inférence? Nom de colonne correspondant + type? – KristoferA

+0

Règles assez simples, avec 1 torsion. La clé primaire d'une table donnée sera toujours nommée "tablename_K", et si c'est une clé étrangère, elle a le même nom. La torsion: les noms des tables sont au pluriel, les noms des clés sont au singulier. Exemple: si le nom de la table est Customers, son pk est Customer_K (et il est désigné comme un pk). Si j'ai une table enfant CustomerInvoices, elle aura une colonne "Customer_K" qui est une clé étrangère pour les clients. – JMarsch