2009-09-08 12 views
0

Je rencontre un certain nombre de problèmes pour tenter de mapper des entités à l'aide de NHibernate fluide.Fluent NHibernate: Comportement de mappage de colonne bizarre

J'ai trois entités, comme celui-ci:

public class Product 
{ 
    public virtual Guid Id { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual Seller Seller { get; set; } 
} 

public class Seller 
{ 
    public virtual Guid Id { get; set; } 
    public virtual IList<Product> Products { get; set; } 
} 

public class Category 
{ 
    public virtual int Id { get; set; } 
} 

Notez que la catégorie utilise un int pour son ID, alors que les autres classes utilisent Guids.

Mes cours de cartographie ressemblent à ceci:

public sealed class ProductDbMap : ClassMap<Product> 
{ 
    public ProductDbMap() 
    { 
     Id(x => x.Id); 

     References(x => x.Seller) 
      .Not.Nullable(); 

     References(x => x.Category, "Category") 
      .Nullable(); 
    } 
} 

public sealed class SellerDbMap : ClassMap<Seller> 
{ 
    public SellerDbMap() 
    { 
     Id(x => x.Id); 

     HasMany(x => x.Products); 
    } 
} 

public sealed class CategoryDbMap : ClassMap<Category> 
{ 
    public CategoryDbMap() 
    { 
     Id(x => x.Id); 
    } 
} 

Enfin, je la convention suivante, qui précise comment les colonnes id de référence doivent être nommés:

public class ReferenceConventions : IReferenceConvention 
{ 
    public bool Accept(IManyToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IManyToOnePart target) 
    { 
     target.ColumnName(target.Property.Name + "Id"); 
    } 
} 

Voici comment NHibernate décide de générer les tables:

create table Product (
    Id UNIQUEIDENTIFIER not null, 
    SellerId UNIQUEIDENTIFIER not null, 
    CategoryId INTEGER, 
    Seller_id UNIQUEIDENTIFIER, 
    primary key (Id) 
) 

create table Seller (
    Id UNIQUEIDENTIFIER not null, 
    primary key (Id) 
) 

create table Category (
    Id integer, 
    primary key (Id) 
) 

Il y a quelques erreurs avec le gener ation de la table Product:

  1. La colonne "SellerId" est dupliquée pour une raison quelconque; la colonne en double ne suit pas ma convention de nommage.
  2. J'essaie de remplacer ma convention de dénomination pour la colonne "CategoryId", en fournissant une valeur de "Category" à la méthode References. Cependant, la table utilise toujours la convention à la place.

Que se passe-t-il?

Répondre

2

Répondre à ma propre question ici.

1) Les colonnes en double se produisent parce que j'ai besoin d'ajouter un HasManyConvention en plus de la ReferenceConvention. Les deux travaillant ensemble ne feront que créer une colonne. Le code pour la HasManyConvention est:

public class HasManyConventions : IHasManyConvention 
{ 
    public bool Accept(IOneToManyPart target) 
    { 
     return true; 
    } 

    public void Apply(IOneToManyPart target) 
    { 
     target.KeyColumnNames.Add(target.EntityType.Name + "Id"); 
    } 
} 

2) Le deuxième problème semble être quelque chose de bizarre avec les conventions de Fluent NHibernate. J'ai cru comprendre que le nom de la colonne ClassMap devrait remplacer la convention (cela est logique et beaucoup plus utile). Cependant, cela ne semble pas se produire. Le problème peut être résolu en vérifiant si le nom de colonne est nul dans la convention:

public class ReferenceConventions : IReferenceConvention 
{ 
    public bool Accept(IManyToOnePart target) 
    { 
     return true; 
    } 

    public void Apply(IManyToOnePart target) 
    { 
     if (target.GetColumnName() == null) 
      target.ColumnName(target.Property.Name + "Id"); 
    } 
} 
Questions connexes