2010-11-30 42 views
3

我在我的一個MVC項目中使用了ConfORM Nhibernate。並有一對多映射的問題。ConfORM Nhibernate OneToManyKeyColumnApplier問題

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

而類Order and User:One User have many orders。

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

和用戶:

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

我期望的關係是這樣的:Orders.UserId - > User.Id在DB。但是,當NHibernate的已經genereted DB我們有這個問題(見圖片):

table structure

UPS。 Double引用User和UserId突然升高。當我們刪除[用戶] Nhivernate不能做內部加入這張表。令人遺憾的是雙倍時間: 列名'User'無效。 列名'User'無效。

我認爲在設置ConfORM時存在一些問題。 如果我刪除mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper)); ConfORM generete只是[User]引用密鑰。

任何人都知道問題在這裏? 在此先感謝。

回答

2

您需要添加以下施放

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

也許那是因爲列名已經從用戶側變了,但還沒有從訂單方面發生變化。