流畅的NHibernate HasManyToMany仅适用于首次加载

时间:2009-10-01 21:20:40

标签: c# asp.net-mvc nhibernate fluent-nhibernate

这对我来说很奇怪。我有一个简单的域名,有2个实体公司和运营商。他们通过另一张桌子有m:m关系。

我将我的Fluent映射设置为

 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控制器中调用它   公司公司= _session.AuthenticatedSellerCompany;             IList运营商= _carrierRepository.GetCarriersByCompany(公司)                                         .ToList();

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

我得到的错误是:

Non-static method requires a target.

逐步调试调试器并深入挖掘:

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

此外,如果我反转映射,将IList运营商放在公司实体上,并尝试通过运营商获取公司的过滤列表,它每次都有效,但我不知道为什么。关于表或m:m表绑定它们没有什么特别之处。

帮助?!

3 个答案:

答案 0 :(得分:1)

异常可能意味着NHibernate试图通过反射访问Company.ID但公司对象为null,因此“需要一个目标” - 目标为空。

我无法分辨原因。但我可以看到你使用Linq-to-NHibernate。我几次也得到了空引用。我刚刚切换到HQL并且从不打扰,因为我可以轻松地测试我的查询,我仍然认为Linq-to-NHibernate有点“未完成”。

尝试重写Linq,例如

从_session.Linq()中的t返回        来自公司        其中c ==公司选择t;

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

尔加!我想通了,通过其他一些代码,我最终将一个空值传递给查询,因此崩溃了。谢谢大家的帮助!