我必须有2个这样的实体:
class A
{
int id { get; set; }
string Name { get; set; }
}
class B
{
int id { get; set; }
A RefToA { get; set; }
string Name { get; set; }
}
如何映射这2个类,以便我有3个这样的表:
表A包含2列:id和name
表B有2列:id和名称
表AB,包含2列:AId和BId
答案 0 :(得分:2)
如果我理解这是正确的,那么您正在创建一个ref表,因为您希望引用可以为空。如果是这种情况,则不需要ref表。只需将表b中的FK设置为可为空即可。然后你可以将它映射为一个简单的参考。然后你会有这样的表:
你可以这样映射:
public class AMap : ClassMap<A>
{
public AMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
public class BMap : ClassMap<B>
{
public BMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.RefToA);
}
}
<强>更新强>
没有办法在nhibernate中映射你想要的方式(没有其他的orm)。原因很简单:它违反了很多规则,并且没有理由这样做。正确的方法是在表b中使用可以为空的fk引用。这就是你在sql数据库中表示引用的方式。如果你指的是一对多,那么使用多对多是一种糟糕的设计,以后肯定会给你带来麻烦。
答案 1 :(得分:1)
这是典型的ManyToMany关系。在FluentNHibernate中,您将使用
HasManyToMany<T>();
http://wiki.fluentnhibernate.org/Fluent_mapping#HasManyToMany_.2F_many-to-many
答案 2 :(得分:1)
你想要的是References(x =&gt; x.RefToA);
以下内容来自流利的nhibernate文件。
参考/多对一
参考文献用于在两个实体之间创建多对一关系;您正在引用另一个实体,因此您使用References方法。引用是指实体的单个实例
答案 3 :(得分:0)
您不应该将一对多关系映射为多对多关系,然后强制它为一对多关系。它设计糟糕,并不能促进数据完整性。如果我是你,我会按如下方式创建你的表格
CREATE TABLE A(
Id INT PRIMARY KEY IDENTITY(1,1),
--Your other columns
)
CREATE TABLE B(
Id INT PRIMARY KEY IDENTITY(1,1),
AId INT REFERENCES A NULL,
--Your other columns
)
这样,您可以按照Fluent NHibernate或任何其他ORM的方式映射它们。