2009-10-01 67 views
0

这对我来说是一个奇怪的。我有一个简单的域名,有两个实体公司和运营商。他们通过另一个表具有m:m关系。流利NHibernate HasManyToMany只适用于第一次加载

设置我流利的映射关系,从而

public partial class Carrier { 
     public virtual int ID { get; set; } 
     public virtual string Name { get; set; } 
     public virtual IList<Company> Companies { get; set; } 
} 

    public class CarrierMap : ClassMap<Carrier> { 
     public CarrierMap() { 
      Id(x => x.ID); 
      Map(x => x.Name); 
      HasManyToMany(x => x.Companies) 
       .Table("CompanyCarrier"); 
     } 
    } 

    public partial class Company { 
     public virtual int ID { get; set; } 
     public virtual string CompanyName { get; set; } 
} 

    public class CompanyMap : ClassMap<Company> { 
     public CompanyMap() { 
      Id(x => x.ID); 
      Map(x => x.CompanyName); 
     } 
    } 

而且我有一个简单的LINQ查询来获取运营商根据公司

public IQueryable<Carrier> GetCarriersByCompany(Company company) { 
     return from t in _session.Linq<Carrier>() 
     where t.Companies.Contains(company) select t; 
    } 

,并调用它所有的MVC控制器 公司company = _session.AuthenticatedSellerCompany; IList carriers = _carrierRepository.GetCarriersByCompany(company) .ToList();

这是事情。它在第一次完美运行,之后每次都失败,直到我再次重新编译。所以我知道在某种程度上查询和映射的工作!

我得到的错误是:

Non-static method requires a target. 

步进通过调试和更深的挖掘,我得到:

PropertyAccessException 
Exception occurred getter of CCMvc.Core.Entities.Company.ID 

而且,如果我扭转映射,把一个IList的运营商对公司实体,并试图通过开利公司获得经过筛选的公司名单,它每次都有效,但我不知道为什么。表或m:m表绑定它们没有什么特别之处。

帮助?

回答

0

嘎!我想通了,通过其他代码,我最终传递一个空值到查询中,因此崩溃。感谢大家的帮助!

1

例外可能意味着NHibernate的尝试经由反射但本公司对象为空访问Company.ID,因此“需要一个目标” - 目标是零。

我无法说出原因。但我可以看到你使用Linq-to-NHibernate。几次我也得到空引用。我只是转向HQL,从不打扰,因为我可以轻松测试我的查询,并且我仍然认为Linq-to-NHibernate有点“未完成”。

尝试从下在t.Companies 其中c ==公司选择吨重写LINQ的,例如从吨_session.Linq()

回报;

也许它不喜欢包含。或者只使用HQL/ICriteria。

+0

这仍然不能解释它为什么它第一次击中它的作品。 我想你的例子,但得到了一个错误: 无法解析特性:使用c:CCMvc.Core.Entities.Carrier 我还是有点用LINQ对于新手,所以我真的不知道如何解决这个问题。 – 2009-10-01 21:47:03

1

这可能是另一种情况的一部分,但过去我用流利的映射碰到过这样的错误。

public CarrierMap() { 
     Id(x => x.ID); 
     Map(x => x.Name); 
     HasManyToMany(x => x.Companies) 
      .Table("CompanyCarrier") 
      .LazyLoad(); 
    } 

将LazyLoad()添加到映射的末尾已经清除了我的个人项目。