2

我有一个以下的数据库方案设置,我不能真正改变。流利的NHibernate映射:一对一(或没有)

User 
---- 
Id (primary key) 
[Some simple properties...] 


UserAdditionalData 
------------------ 
Id  (primary key) 
[Some simple properties...] 
USERID (foreign key to User) 

很明显的是,User表并没有真正有它是否链接到UserAdditionalData记录的任何记忆,所以我不认为我可以在这里称这是一个真正的一个一对一映射因为他们也不会分享互斥的PK。

但是,实际上,我希望能够在User对象上工作,例如检查它是否有UserAdditionalData记录,如果是,请访问其属性。

我建立了我的BDO这样:

public class User 
{ 
    [Some simple properties...] 
    public virtual UserAdditionalData UserAdditionalData { get; set; } 
} 

public class UserAdditionalData 
{ 
    [Some simple properties...] 
    public virtual User User { get; set; } /* I have this here, 
               but I don't really ever 
               have to access it in this 
               direction */ 
} 

我建立了我的映射,例如:

public UserMapping() 
    { 
     Table("USER"); 
     [Some simple properties...] 
     HasOne(x => x.UserAdditionalData).Cascade.None(); 
    } 


    public UserExtraMapping() 
    { 
     Table("USER_ADDITIONAL_DATA"); 
     [Some simple properties...] 
     References(x => x.User, "USERID").Unique(); 
    } 

这一切编译,但是我看到我的UserExtra对象(当通过User对象访问时)始终为空。 我已经尝试了很多不同的方式去了解它,阅读了很多关于实现这个作为一对多。但是,我仍然无法使其工作。

任何帮助将非常感激。

谢谢!

[小UPDATE]:我只需要查询数据库,而不是保存到它,如果这是相关的任何方式。

+0

'HasOne'和'References'设置你为我工作。SQL NHibernate生成的外观是否正确? – 2014-09-01 20:34:29

回答

1

根据您的小更新,我会去一个简化的映射。我们将从NHibernate真正的映射能力中受益,并优化用户负载。所有这一切,因为我们确实需要只读映射。

首先,我们应当在附加类介绍简单int属性UserId现在

// extra class is having an int property containig the foreign key 
public class UserAdditionalData 
{ 
    public virtual int UserId { get; set; } 
} 

// that would be the mapping: 
public UserExtraMapping() 
{ 
    ... 
    Map(x => x.UserId, "USERID"); 
} 

,我们会在比较使用良好优化映射迟缓装载many-to-one(Ie随一到其中一个加载两端始终,这里我们将只有在真正需要时才能获得参考数据!)

public UserMapping() 
{ 
    ... 
    References(x => x.UserAdditionalData) 
      .LazyLoad() 
      .PropertyRef(e => e.UserId) 
      .Not.Insert() 
      .Not.Update() 
      ; 
} 

因此,对于只读我会做最好使用many-to-one映射(References()

还看到: