3

最近、私は、エンタープライズ アプリケーションの NHibernate と EF5 の比較という質問に戻ってきました。私は多くの重要な違いを知っていますが、これは私にとって最も驚くべきものです. Customer と Order (1:n) という 2 つの従来のエンティティを考えてみましょう。

public class Customer
{
    public Customer()
    {
        Orders = new HashSet<Order>();
    }

public virtual Guid Id { get; set; }
public virtual string Name { get; set; }

    **public virtual ICollection<Order> Orders { get; set; }**
}

public class Order
{
public virtual Guid Id { get; set; }
public virtual Guid CustomerId { get; set; }
public virtual string Number { get; set; }
public virtual DateTime Date { get; set; }

    **public virtual Customer Customer { get; set; }**
}

NHibernate と EF5 の両方に、双方向のマッピングがあります。それに応じて、EF5 および NHibernate の DbContext および Session のコンテキストですべての顧客およびすべての注文をロードするためのコード スニペット:

        using (TestOrmForDalDbEntities context = new TestOrmForDalDbEntities())
        {
            context.Configuration.ProxyCreationEnabled = false;

            IQueryable<Customer> customers = context.Customers;
            customers.Load();

            IQueryable<Order> orders = context.Orders;
            orders.Load();
        }



using (ISession session = _sessionFactory.OpenSession())
{
    var customers = session.Query<Customer>().ToList();
    var orders = session.Query<Order>().ToList();

}

結果は次のとおりです。

EF5: 各顧客は適切な注文のコレクションを持っています (EF5 はそれらを自動的に接続します) NHibernate: 適切な注文のコレクションを持っている顧客はいません。各注文には適切な顧客へのリンクがありますが。

問題は、そのような方法で接続しないのはNHibernateのアイデアですか、それともNHibernateの構成方法を知らないのは私ですか?

NHibernate の PS マッピング:

    public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id).UnsavedValue(Guid.Empty).GeneratedBy.Guid();
        Map(x => x.Name);
        HasMany(x => x.Orders).Cascade.All();
    }
}

public OrderMap()
    {
        Id(x => x.Id).UnsavedValue(Guid.Empty).GeneratedBy.Guid();
        Map(x => x.Number);
        Map(x => x.Date);
        Map(x => x.CustomerId);
        References(x => x.Customer);

}

4

1 に答える 1

0

Customers から Orders (HasMany) への関係は Inverse である必要があります。つまり、Customer への外部キーを持つ Order エンドポイントです。

于 2014-10-08T04:40:33.997 に答える