【问题标题】:Fluent NHibernate HasManyToMany only works on first loadFluent NHibernate HasManyToMany 仅适用于首次加载
【发布时间】:2012-11-13 03:07:40
【问题描述】:

这对我来说很奇怪。我有一个包含 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(company) .ToList();

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

我得到的错误是:

Non-static method requires a target.

通过调试器并深入挖掘我得到:

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

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

帮忙?!

【问题讨论】:

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


    【解决方案1】:

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

    我说不出原因。但我可以看到您使用的是 Linq-to-NHibernate。我也从它那里得到了几次空引用。我只是切换到 HQL 并且从不打扰,因为我可以轻松地测试我的查询,而且我仍然认为 Linq-to-NHibernate 有点“未完成”。

    尝试重写Linq,例如

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

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

    【讨论】:

    • 这仍然不能解释为什么它在第一次被击中时起作用。我尝试了您的示例,但出现错误:无法解析属性:c of: CCMvc.Core.Entities.Carrier 我仍然是 linq 的新手,所以我真的不知道如何解决这个问题。
    【解决方案2】:

    这可能是另一种情况的一部分,但我过去曾多次使用流畅的映射遇到该错误。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        相关资源
        最近更新 更多