【问题标题】:How to do a one-to-one relationship with null in NHibernate?如何在 NHibernate 中与 null 建立一对一的关系?
【发布时间】:2013-03-04 04:02:22
【问题描述】:

我有两个具有一对一关系的 NHibernate 实体。我们称他们为狗和主人。

public class Dog 
{
    public virtual int Id { get;set; }
    public virtual Owner Owner { get; set; }
}

public class Owner 
{
    public virtual int Id { get; set; }
    public virtual Dog Dog { get; set; }
}

Dog 可能有一个或零个所有者。 Fluent/NHibernate 映射如下:

public class DogMap : ClassMap<Dog> 
{
    public DogMap() 
    {
        Table("Dogs");

        Id(x => x.Id);

        HasOne( x=> x.Owner)
            .Fetch.Join()
            .Not.LazyLoad();
    }
}

public class OwnerMap : ClassMap<Owner> 
{
    public OwnerMap() 
    {
        Table("Owners");

        // Owners share the same primary-key as dogs
        Id(x => x.Id).GeneratedBy.Foreign("Dog"); 

        References( x => x.Dog)
            .Unique()
            .Not.LazyLoad();
   }
}

现在我只想选择 没有主人的狗

我假设查询是:

Owner owner = null;
var ownerlessDogs = session
    .QueryOver<Dog>()
    .Left.JoinAlias(x => x.Owner, () => owner)
    // Restrict on alias
    .WhereRestrictionOn(() => owner).IsNull
    .List();

但正如您可能已经猜到的那样,这是行不通的。它会抛出“对象引用未设置为 ...”。

如果我尝试,

var ownerlessDogs = session
    .QueryOver<Dog>()
    .Left.JoinAlias(x => x.Owner, () => owner)
    // Restrict on property of root object
    .WhereRestrictionOn(x => x.Owner).IsNull
    .List();

它生成基本上生成

SELECT {{relevant columns}}
FROM Dogs dogs
LEFT OUTER JOIN OWNERS owners
WHERE dogs.Id IS NULL

几乎正确,但它是过滤狗的主键,而不是狗的外键。

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping nhibernate-criteria


    【解决方案1】:

    an old post in the Hibernate forum 的帮助下,我找到了解决方案:

    public class DogMap : ClassMap<Dog> {
    
        public DogMap() {
            Table("Dogs");
            Id(x => x.Id);
    
            HasOne( x=> x.Owner)
              .Fetch.Join();
        }
    }
    
    public class OwnerMap : ClassMap<Owner> {
    
       public OwnerMap() {
    
       Table("Owners");
    
       //owners share the same primary-key as dogs
       Id(x => x.Id).GeneratedBy.Foreign("Dog"); 
    
       //both sides should be mapped as HasOne
       HasOne( x => x.Dog)
         .Constrained()
         .Fetch.Join();
       }
    }
    

    工作查询是

    var ownerlessDogs = session
      .QueryOver<Dog>()
      .Left.JoinAlias(x => x.Owner, () => owner)
      //this is the trick, restrict on Id
      .WhereRestrictionOn( x => x.Owner.Id ).IsNull
      .List();
    

    【讨论】:

    • 显然要等两天过去了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2023-04-11
    相关资源
    最近更新 更多