3

MVC プロジェクトの 1 つで ConFORM Nhibernate を使用しています。1対多のマッピングに問題がありました。

        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 および User: One User には多くの Order がありました。

 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。しかし、Nhibernate が DB を生成したときに、この問題が発生しました (画像を参照)。

テーブル構造

UPS。二重参照 User と UserId が突然発生しました。[user] を削除すると、Nhivernate はこのテーブルの内部結合を行うことができません。2 倍の時間が悲しい: 列名 'User' が無効です。列名 'User' が無効です。

ConFORMの設定に問題があると思います。mapper.PatternsAppliers.Merge(new OneToManyKeyColumnApplier(relationalMapper)); を削除すると ConFORM は [User] 参照キーだけを生成します。

ここで何が問題なのか知っている人はいますか?前もって感謝します。

4

1 に答える 1

2

次のアプライヤーを追加する必要があります

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

おそらく、ユーザー側からは列名が変更されていますが、オーダー側からは変更されていないためです。

于 2010-11-30T18:56:28.783 に答える