【问题标题】:Guid restrictions in Nhibernate QueryoverNhibernate Queryover 中的 Guid 限制
【发布时间】:2012-03-06 17:00:30
【问题描述】:

我有两个最简单的实体,类似于:

public class User
{
    int id;
    string name;
    Guid Guid;
    IList<Rentals> Rentals;
}

public class Rentals
{
    int Id { get; protected set; }
    User User { get; set; }
    int DvdId { get; set; }
}    

(我已经声明了所有公共虚拟属性和所有内容,只是为了简化在这里不提)

假设每个User 会有很多Rentals,我想通过他的Guid 选择某个用户的所有DvdId

我遇到了一个异常,这个:could not resolve property: User.Guid

这就是我在我的存储库中所做的:

DetachedCriteria dc = QueryOver.Of<Rentals>()
    .Where(r => r.User.Guid == userGuid)
    .Select(r => r.DvdId)
    .DetachedCriteria;

userGuid 正在通过单元测试。 (这是我知道存在的那个)

如果我这样做:

DetachedCriteria dc = QueryOver.Of<Rentals>()
    .Where(r => r.User.Id == 1) // Note - replaced guid with id (an int)
    .Select(r => r.DvdId)
    .DetachedCriteria;

这很好用。所以我猜测需要为引导比较做一些事情..

我的 guid 映射是这样的:(在 UserMap 类下)

Map(x => x.Guid, "Guid")
    .Not.Nullable();

我正在流利地使用来映射实体。

那么....请问如何对 guid 应用限制?

【问题讨论】:

    标签: nhibernate guid queryover


    【解决方案1】:

    相关实体的 ID 被视为special。多对一的外键总是被水合。这是因为 NHibernate 使用延迟加载,所以这是完全有效的:-

     .Where(r => r.User.Id == 1)
    

    但是这是无效的,因为在设置 Guid 之前需要对相关实体进行水合:-

    .Where(r => r.User.Guid == userGuid) 
    

    因此,您需要在查询中加入 UserRentals,类似于:-

     .QueryOver.Of<Rentals>()
     .JoinQueryOver<User>(x => x.User)
     .Where(x => x.Guid == userGuid)
    

    注意:这是未经测试的,所以如果有任何问题,请告诉我。

    【讨论】:

    • 太棒了!现在,我不仅知道我需要做什么才能让它工作,而且我也知道它为什么不起作用!非常感谢。如果可以的话,我会不止一次地赞这个!
    【解决方案2】:

    你也可以比较实体:

    var user = session.Load<User>(userGuid);
    ...
    .Where(r => r.User == user)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      相关资源
      最近更新 更多