假设我们有以下型号:
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的问题吗?
答案 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);