这对我来说很奇怪。我有一个简单的域名,有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表绑定它们没有什么特别之处。
帮助?!
答案 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)
尔加!我想通了,通过其他一些代码,我最终将一个空值传递给查询,因此崩溃了。谢谢大家的帮助!