Fluent-NHibernate:如何将一对多关系映射到3个表(多对多,有点)

时间:2010-01-22 14:26:50

标签: nhibernate fluent-nhibernate nhibernate-mapping

我必须有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

4 个答案:

答案 0 :(得分:2)

如果我理解这是正确的,那么您正在创建一个ref表,因为您希望引用可以为空。如果是这种情况,则不需要ref表。只需将表b中的FK设置为​​可为空即可。然后你可以将它映射为一个简单的参考。然后你会有这样的表:

  • 表A,包含2列:id和name
  • 表B有2列:id,name和 援助(可空)

你可以这样映射:

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方法。引用是指实体的单个实例

<强> http://wiki.fluentnhibernate.org/Fluent_mapping

答案 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的方式映射它们。