FirstOrDefault在外键上返回null

时间:2015-07-29 09:06:56

标签: c# nhibernate fluent-nhibernate

假设我们有以下型号:

public class ReadingOrder
{
    public virtual int Id { get; set; }
    public virtual Order Order { get; set; }
}

映射:

Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order, "OrderId");

我希望得到ReadingOrder等于orderId的{​​{1}}(例如)。 但是当我尝试FirstOrDefault时,查询返回null:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1);

如果我得到了所有这些并且在应用FirstOrDefault作品之后,但它的愚蠢:

var readingOrderList1 = _repositoryFactory.GetRepository<ReadingOrder>()
                         .GetAll().FirstOrDefault(xz => xz.Order.Id == 1);

来自存储库的方法具有以下格式:

public T FirstOrDefault(Expression<Func<T, bool>> predicate)
{
   return _session.Query<T>().FirstOrDefault(predicate);
}

简单的东西,但不起作用。如果我选择正常的属性,例如Id,那么一切都按预期工作。 此外,如果我从日志中获取生成的查询并将其放在sqlite中,它将成功运行并返回读取顺序。 NHibernate有错误吗?是映射问题吗?或者这是SQLite的问题吗?

5 个答案:

答案 0 :(得分:1)

好的,最后我发现了问题:外键列的名称“OrderId”。 在这种情况下,Nhibernate会查找“Hibernate.Order”,我不知道为什么,但是在我更改了列的名称后,现在可以从db中检索该项目。谢谢大家的答案!我向用户 Syed Farjad Zia Zaid i提供了赏金,因为他帮我解决了问题。很明显这是一个Nhibernate问题,所以再次感谢你。

答案 1 :(得分:0)

我认为有两种方法可以让您的映射更改为:

Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order);

然后查询:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1);

否则您也可以将映射更改为:

Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order).Column("OrderId");

然后查询:

var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.OrderId == 1);

答案 2 :(得分:0)

有时与动态全局过滤器有关,例如IsDeleted道具的软删除方法,因此您需要获取被忽略的项目并在ef中使用类似.IgnoreQueryFilters()的方法。

答案 3 :(得分:-1)

相同的方案可以在存储库中使用以下代码。

      public virtual IEnumerable<T> Get(
      Expression<Func<T, bool>> filter = null,
      Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
      string includeProperties = "")
    {

            IQueryable<T> query = _context.Set<T>();

            if (filter != null)
            {
                query = query.Where(filter);
            }
            if (includeProperties != null)
                foreach (var includeProperty in includeProperties.Split
                    (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    query = query.Include(includeProperty);
                }

            return query.ToList();
        }


    }

答案 4 :(得分:-1)

像这样修改你的课程:

public class ReadingOrder
{
    public virtual int Id { get; set; }
    public virtual Order Order { get; set; }
    public virtual int OrderId { get; set; }    // Explicit and direct foreign Key
}

然后使用OrderId检索您的查询,而不是Order.Id

var readingO = _repositoryFactory.GetRepository<ReadingOrder>()
                                 .FirstOrDefault(xz => xz.OrderId == 1);