2010-11-30 5 views
3

J'utilise ConfORM Nhibernate dans l'un de mes projets MVC. Et a eu un problème avec One to Many Mappings.ConfORM Nhibernate OneToManyKeyColumnApplier Problème

 IEnumerable<Type> domainEntities = this.GetDomainEntities(); 

     var relationalMapper = new ObjectRelationalMapper(); 
     relationalMapper.TablePerConcreteClass(domainEntities); 
     relationalMapper.Patterns.PoidStrategies.Add(new NativePoidPattern()); 
     relationalMapper.Cascade<Category, Product>(Cascade.All); 
     relationalMapper.ManyToMany<Category, Product>(); 
     relationalMapper.Cascade<Order, Product>(Cascade.Persist); 

     var mapper = new Mapper(relationalMapper); 
     var englishInflector = new EnglishInflector(); 

     mapper.PatternsAppliers.Merge(new ClassPluralizedTableApplier(englishInflector)); 
     mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper)); 
     ..... 

     HbmMapping mapping = mapper.CompileMappingFor(domainEntities); 

Et les classes Ordre et utilisateur: un utilisateur avait plusieurs commandes.

public class Order : BaseEntity 
{ 
    public Order(User user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException("user"); 
     } 

     this.User = user;   
    } 

    protected Order() 
    { 
    } 

    public virtual User User { get; protected set; }  
} 

Et les utilisateurs:

public class User : BaseEntity 
{ 
    public User() 
    { 
     this.Orders = new HashedSet<Order>(); 
    } 

    public virtual string FirstName { get; set; }  

    public virtual ISet<Order> Orders { get; protected set; } 
} 

j'attends des relations comme ceci: Orders.UserId -> User.Id dans le DB. Mais quand le Nhibernate avait genereted DB nous avons eu ce problème (voir image):

table structure

UPS. Double référence Utilisateur et UserId soudainement surlignée. Et quand nous avons enlevé [utilisateur] Nhivernate ne peut pas faire de jointure interne de ces tables. C'est triste que le double temps: Nom de colonne invalide 'User'. Nom de colonne non valide "Utilisateur".

Je pense qu'il y a quelques problèmes avec la configuration de ConfORM. Si je supprime mapper.PatternsAppliers.Merge (new OneToManyKeyColumnApplier (relationalMapper)); ConfORM génère simplement la clé de référence [Utilisateur].

Quelqu'un sait quel est le problème ici? Merci d'avance.

Répondre

2

Vous devez ajouter le suivant Applicateur

mapper.PatternsAppliers.Merge(new ManyToOneColumnApplier()); 

des thats probablement parce que le nom de la colonne a changé de côté des utilisateurs, mais n'a pas changé d'un côté de la commande.