2010-11-30 7 views
3

Ich verwende ConFORM Nhibernate in einem meiner MVC-Projekt. Und hatte ein Problem mit One to Many Mappings.ConFORM Nhibernate OneToManyKeyColumnApplier Problem

 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); 

Und Klassen Bestellung und Benutzer: Ein Benutzer hatte viele Bestellungen.

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; }  
} 

Und Benutzer:

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; } 
} 

Ich erwarte, dass die Beziehungen wie folgt aus: Orders.UserId -> User.Id im DB. Aber wenn der Nhibernate genereted hatte DB hatten wir dieses Problem (siehe Bild):

table structure

UPS. Double Referenz User und UserId plötzlich erhöht. Und wenn wir [Benutzer] entfernt haben, kann Nhivernate nicht innerlich an diesen Tabellen teilnehmen. Es ist traurig, dass doppelte Zeit: Ungültiger Spaltenname 'Benutzer'. Ungültiger Spaltenname 'Benutzer'.

Ich denke, es gibt einige Probleme mit der Einrichtung von ConFORM. Wenn ich mapper.PatternsAppliers.Merge (neue OneToManyKeyColumnApplier (relationalMapper)) entfernen; ConFORM generete nur [Benutzer] Referenzschlüssel.

Wer weiß, was das Problem hier ist? Vielen Dank im Voraus.

Antwort

2

Sie benötigen die folgende Applier

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

Wahrscheinlich das ist hinzuzufügen, weil Spaltennamen von Benutzerseite geändert hat, ist aber nicht von Bestellseite geändert.