C# Fluent NHibernate HasManyToMany仅在首次加载时工作
这对我来说是个奇怪的问题。我有一个简单的领域与2个实体公司和承运人。它们通过另一个表具有m:m关系 我这样设置了我的Fluent映射C# Fluent NHibernate HasManyToMany仅在首次加载时工作,c#,asp.net-mvc,nhibernate,fluent-nhibernate,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 { ge
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);
}
}
逐步通过调试器并深入挖掘我得到:
PropertyAccessException
Exception occurred getter of CCMvc.Core.Entities.Company.ID
此外,如果我反转映射,在公司实体上放置一个IList Carriers,并尝试通过一个Carrier获得一个过滤过的公司列表,它每次都会工作,但我不知道为什么。表或绑定它们的m:m表都没有什么特别之处
救命啊 异常可能意味着NHibernate试图通过反射访问Company.ID,但Company对象为null,因此“需要一个目标”——目标为null 我说不出原因。但是我可以看到你用Linq来代替NHibernate。我还多次从它那里得到空引用。我刚切换到HQL,从来没有困扰,因为我可以很容易地测试我的查询,我仍然认为LINQ到NHiBiNIT有点“未完成”。 例如,尝试重写Linq 从t in_session.Linq()返回 从c到t公司 其中c==公司选择t
也许它不喜欢它。或者只使用HQL/ICriteria。这可能是另一种情况的一部分,但在过去使用fluent映射时,我曾多次遇到这个错误
public CarrierMap() {
Id(x => x.ID);
Map(x => x.Name);
HasManyToMany(x => x.Companies)
.Table("CompanyCarrier")
.LazyLoad();
}
将LazyLoad()添加到映射的末尾,这为我的个人项目清除了障碍。Gah!我发现,通过一些其他代码,我最终向查询传递了一个空值,因此崩溃了。谢谢大家的帮助 但这仍然不能解释为什么它在第一次被击中时就起作用。我尝试了您的示例,但出现了一个错误:无法解析属性:c of:CCMvc.Core.Entities.Carrier我对linq还是有点陌生,所以我真的不知道如何解决这个问题。
PropertyAccessException
Exception occurred getter of CCMvc.Core.Entities.Company.ID
public CarrierMap() {
Id(x => x.ID);
Map(x => x.Name);
HasManyToMany(x => x.Companies)
.Table("CompanyCarrier")
.LazyLoad();
}