2009-12-18 2 views
2

J'utilise EF v1. J'ai les tables suivantes:Entity Framework - Multiplicité différente en SSDL et CSDL

CREATE TABLE category ( 
    category_id int , 
    category_name varchar(100) not null, 
CONSTRAINT PRIMARY KEY (category_id) 
) 

CREATE TABLE categoryDetails ( 
    detail_id int, 
    category_desc varchar(100) not null, 
    category_id int NOT NULL, 
CONSTRAINT PRIMARY KEY (detail_id), 
CONSTRAINT FOREIGN KEY (category_id) REFERENCES category(category_id) 
) 

Une 'catégorie' peut avoir 0..1 'categoryDetails'. Dans le modèle EF généré à partir de la base de données ci-dessus, EF modélise la relation comme * dans SSDL et CSDL. Utilisant le concepteur, CSDL, je peux changer la relation/association à 0..1 de *. Mais en vérifiant SSDL il reste comme *. Lors du changement à 0..1 dans SSDL, je reçois l'erreur:

"Multiplicity is not valid in Role R111 in relationship RL111. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *." 

S'il vous plaît dire comment changer SSDL?

Dans ce cas (0..1 en CSDL et * en SSDL) les classes partielles sont créées pour le code selon la relation 0..1 (ie une seule propriété de référence dans chaque classe, contenant un type de l'autre classe - pas de collection concernée). Sur le code en cours d'exécution, il fonctionne sans erreurs. Est-ce correct (multiplicité différente en SSDL et CSDL)?

Pour les cas où la structure de la table ne peut PAS être modifiée, quelle est la solution pour obtenir l'association 0..1?

Merci.

Répondre

4

Aujourd'hui, l'EF ne raisonne pas sur l'unicité autre que pour les colonnes PK. Cela signifie que vous ne pouvez pas avoir 0..1 dans le SSDL sans que le FK ne soit aussi le PK, car en ce qui concerne le FE, rien dans la base de données n'impose la contrainte de cardinalité.

C'est-à-dire que l'EF ne connaît pas les contraintes d'unicité, elle ne vous croit donc pas!

Cependant, comme vous l'avez découvert, vous pouvez réduire la cardinalité dans la CSDL à 0..1, même si dans la SSDL elle est toujours *. Et comme l'EF applique une sémantique basée sur la CSDL, cela devrait fonctionner correctement.

Ainsi, le code (avec 0..1 dans la CSDL et * dans le SSDL):

var category = ctx.Category.Include("Details").First(c => c.ID = 1); 
var oldDetails = category.Details; 
category.Details = new CategoryDetails {....}; 
ctx.SaveChanges(); 

tentera de supprimer oldDetails.

WARNING:in EF 4.0 there is another type of association (called FK associations) and unlike independent associations (i.e. the type supported by 3.5) you can't narrow the cardinality of an FK association in the CSDL.

Hope this helps

Alex

+0

Merci pour la réponse. – dev

Questions connexes