2010-11-30 6 views
3

私はConforM NhibernateをMVCプロジェクトの1つで使用しています。そして、1対多マッピングに問題があった。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); 

クラスオーダーとユーザー:1人のユーザーには多くのオーダーがあります。

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 - DBで> User.Idを。

table structure

UPS:NHibernateのは、DB generetedたときしかし、我々はこの問題を(画像参照)でした。ダブルリファレンスUserとUserIdが突然uppearedしました。そして、私たちが[ユーザー]を削除すると、Nhivernateはこのテーブルを内部結合することはできません。それは二重の時間を悲しんだ: 無効な列名 'ユーザー'。 無効な列名 'User'です。

ConfORMの設定にはいくつかの問題があると思います。 mapper.PatternsAppliers.Mergeを削除した場合(new OneToManyKeyColumnApplier(relationalMapper)); ConforM generete just [User]参照キー。

誰でも問題が何であるか知っていますか? ありがとうございました。列名は、ユーザー側から変更されていますが、受注側から変更されていないので、あなたは、次のプライヤ

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

を追加する必要が

答えて

2

はおそらくthatsの。

関連する問題