2012-02-23 5 views
1

Disons que j'ai une classe de produit qui possède une propriété Catégorie.Pourquoi deux colonnes sont-elles créées pour une clé étrangère?

public class Product : Entity<int> // Base class defines the Id 
{ 
    public virtual ProductCategory Category { get; set; } 
} 

Le fichier de mappage est simple

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
    Id(x => x.Id); 
    References(x => x.Category).Nullable(); 
    } 
} 

Utiliser SchemaExport.Create Cela a créé deux colonnes dans ma base de données, et ProductCategoryIdCategoryId. Compte tenu de mes conventions, seulement CategoryId devrait exister. Les deux sont nullables, mais seulement CategoryId est utilisé. Quoi qu'il en soit, ProductCategoryId est toujours nulle, et c'est la colonne avec la contrainte de clé étrangère sur elle.

Pourquoi est-ce? Je ne peux pas vraiment trouver de problèmes avec le code, autant que je peux dire que tout fonctionne bien en utilisant la colonne CategoryId. Je peux interroger/enregistrer/mettre à jour avec ou sans une catégorie. Je ne saurais même pas si l'autre colonne existait si je ne regardais pas dans la base de données, mais je n'aime pas avoir une colonne quand je ne sais pas à quoi elle sert. Y a-t-il une raison pour cela ou est-ce que quelque chose ne va pas dans la façon dont j'ai mappé une référence nullable?

Répondre

0

Eh bien, le problème n'a rien à voir avec la classe Product ou ProductMap, je crois. Le problème est avec la carte ProductCategory.

C'est ce qui crée la colonne ProductCategoryId dans la base de données.

public class ProductCategoryMap : ClassMap<ProductCategory> 
{ 
    public ProductCategoryMap() 
    { 
     Id(x => x.Id); 
     // Other mappings 
     HasMany(x => x.Products).Inverse().Cascade.AllDeleteOrphan(); 
    } 
} 

Cette cartographie n'a pas été en mesure de dire qu'il était censé être en utilisant la colonne CategoryId existante. Le spécifier sur le fichier de mappage ou même renommer ma propriété Category sur la classe Product en ProductCategory l'oblige à arrêter de créer une colonne différente.

Questions connexes