NHibernate vs Entity Framework 5 自动连接实体

Posted

技术标签:

【中文标题】NHibernate vs Entity Framework 5 自动连接实体【英文标题】:NHibernate vs Entity Framework 5 auto connecting entities 【发布时间】:2013-04-10 12:56:19 【问题描述】:

最近我回到了企业应用程序的 NHibernate 与 EF5 的问题。 我知道许多重要的区别,但这个对我来说是最令人惊讶的。 考虑两个经典实体 Customer 和 Order (1:n):

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 的上下文中加载所有客户和所有订单的代码 sn-ps:

        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 的映射:

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

【问题讨论】:

您在 nhibernate 示例中的映射很可能有问题。你能把你的映射也显示出来吗? 2 Mattias:我已经添加了映射 作为一个实验,能不能去掉对NH测试的CustomerId的映射。 (在我看来)它可能会有所帮助。 【参考方案1】:

从客户到订单 (HasMany) 的关系应该是反向的,这意味着,它是具有客户外键的订单端点。

【讨论】:

以上是关于NHibernate vs Entity Framework 5 自动连接实体的主要内容,如果未能解决你的问题,请参考以下文章

csharp: NHibernate and Entity Framework (EF) (object-relational mapper)

Entity Framework 4.1 和 NHibernate 的获取策略封装

ADO.NET Entity Framework 和 NHibernate - 何时使用其中之一

linq to sql、Entity Framework 和 NHibernate 的性能如何?

想请问一下Adp.net与Ado.net Entity Framework、NHibernate性能对比

NHibernate / vs2005消息,未能找到元素