我有一个类似于Fluent NHibernate: How to create one-to-many bidirectional mapping?的问题,但我对一对一映射的情况很感兴趣。例如
Umbrealla
ID
Owner
UmbreallaOwner
ID
Umbrella正如我们所知,每把雨伞只能归一个人所有,没有人拥有超过一把雨伞。在一个流畅的地图中,我会有这样的东西
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属性?我看到的示例涉及到在两个方向上设置关系,因此添加一个新的雨伞看起来像这样
AddUmbrealla(UmbrellaOwner owner)
{
var brolly = new Umbrella();
brolly.Owner = owner;
owner.Umbrella = brolly;
session.Save(owner); //assume cascade
}这看起来合乎逻辑,但有点麻烦。
发布于 2011-04-01 01:32:16
引用就是引用;一个对象有一个对另一个对象的引用。反之亦然。
在您的情况下,您可能不会受到HasOne关系的影响。但是,HasOne通常用于非正规化数据。假设您想要关于所有者的更多信息,但是您不能更改所有者的模式,因为其他代码依赖于它。您将创建一个AdditionalOwnerInfo对象,并在模式中创建表,其中表的OwnerID字段是所有者的外键,也是表的主键。
Ayende建议在99.9%的一对一情况下使用双边引用()关系,在这种情况下,第二个对象在概念上与第一个对象是分开的,但存在一种隐含的“我一个人只拥有一件东西”类型的关系。可以使用在引用贴图上设置的Unique().Not.Nullable()修改器强制执行引用的"one and one only“性质。
要简化引用设置,请考虑将一个对象(UmbrellaOwner)定义为“父对象”,将另一个对象(伞)定义为“子对象”,并在父对象的属性设置器中,将子对象的父对象设置为当前引用:
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;
}
}
}现在,当您将子项分配给父项时,会自动设置反向引用:
var owner = new UmbrellaOwner{Umbrella = new Umbrella()};
Assert.AreEqual(owner, owner.Umbrella.Owner); //true;https://stackoverflow.com/questions/5503388
复制相似问题