首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluent NHibernate:如何创建一对一的双向映射?

Fluent NHibernate:如何创建一对一的双向映射?
EN

Stack Overflow用户
提问于 2011-04-01 00:51:23
回答 1查看 2.1K关注 0票数 7

我有一个类似于Fluent NHibernate: How to create one-to-many bidirectional mapping?的问题,但我对一对一映射的情况很感兴趣。例如

代码语言:javascript
复制
Umbrealla
  ID
  Owner

UmbreallaOwner
  ID
  Umbrella

正如我们所知,每把雨伞只能归一个人所有,没有人拥有超过一把雨伞。在一个流畅的地图中,我会有这样的东西

代码语言:javascript
复制
UmbrellaMap()
{
   Id(x=>x.ID);
   References<UmbrellaOwner>(x=>x.Owner);
}

UmbrellaOwnerMap()
{ 
   Id(x=>x.ID);
   References<Umbrella>(x=>x.Umbrella);
}

在创建表时,fluent将在保护伞中创建一个引用umbrellaOwner的ID的字段,并在引用保护伞的umbrellaOwner中创建一个字段。有没有办法更改映射,使之只创建一个外键,但同时存在Umbrella属性和Owner属性?我看到的示例涉及到在两个方向上设置关系,因此添加一个新的雨伞看起来像这样

代码语言:javascript
复制
AddUmbrealla(UmbrellaOwner owner)
{
   var brolly = new Umbrella();
   brolly.Owner = owner;
   owner.Umbrella = brolly;
   session.Save(owner); //assume cascade
 }

这看起来合乎逻辑,但有点麻烦。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-01 01:32:16

引用就是引用;一个对象有一个对另一个对象的引用。反之亦然。

在您的情况下,您可能不会受到HasOne关系的影响。但是,HasOne通常用于非正规化数据。假设您想要关于所有者的更多信息,但是您不能更改所有者的模式,因为其他代码依赖于它。您将创建一个AdditionalOwnerInfo对象,并在模式中创建表,其中表的OwnerID字段是所有者的外键,也是表的主键。

Ayende建议在99.9%的一对一情况下使用双边引用()关系,在这种情况下,第二个对象在概念上与第一个对象是分开的,但存在一种隐含的“我一个人只拥有一件东西”类型的关系。可以使用在引用贴图上设置的Unique().Not.Nullable()修改器强制执行引用的"one and one only“性质。

要简化引用设置,请考虑将一个对象(UmbrellaOwner)定义为“父对象”,将另一个对象(伞)定义为“子对象”,并在父对象的属性设置器中,将子对象的父对象设置为当前引用:

代码语言:javascript
复制
public class Umbrella
{
  public virtual string ID { get; set; }
  public virtual Owner Owner { get; set; }
}

public class UmbrellaOwner
{
  public virtual string ID { get; set; }
  private Umbrella umbrella;
  public virtual Umbrella Umbrella
  {
    get{
      return umbrella;
    }
    set{
      umbrella = value;
      if(umbrella != null) umbrella.Owner = this;
    }
  }
}

现在,当您将子项分配给父项时,会自动设置反向引用:

代码语言:javascript
复制
var owner = new UmbrellaOwner{Umbrella = new Umbrella()};
Assert.AreEqual(owner, owner.Umbrella.Owner); //true;
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5503388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档