繁体   English   中英

FirstOrDefault在外键上返回null

[英]FirstOrDefault returns null on foreign key

可以说我们有以下型号:

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");

我想得到orderId等于1的ReadingOrder (例如)。 但是当我尝试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的问题?

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

我认为有两种方法可以使这项工作更改您的映射:

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);

有时候这与动态全局过滤器有关,比如IsDeleted prop的软删除方法,所以你需要获取被忽略的项目并使用像这样的.IgnoreQueryFilters()等方法。

使用存储库中的以下代码,相同的方案可以正常工作。

      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();
        }


    }

像这样修改你的类:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM