3

我很难利用 Fluent NHibernate 的 HasOne 映射。基本上,A 类在 B 类中可以有一个匹配的(只有一个或没有)记录。

请帮助定义关系的 AMap 和 BMap 类。

谢谢你。

public class A
{
   public virtual int Id {get;set;}
   public virtual string P1 {get;set;}
   public virtual string P2 {get;set;}
   public virtual string P3 {get;set;}
}

public class B
{
   public virtual int Id {get;set;}
   public virtual string P4 {get;set;}
   public virtual string P5 {get;set;}
   public virtual string P6 {get;set;}
}
4

1 回答 1

8

要使one-to-one映射工作,您需要根据以下代码B向类添加类型属性,A反之亦然。由于 NHibernate 不支持单向一对一,因此这两个类都需要这些引用。

public class A
{
  public virtual int Id {get;set;}
  public virtual string P1 {get;set;}
  public virtual string P2 {get;set;}
  public virtual string P3 {get;set;}
  public virtual B child { get; set; }
}

public class B
{
  public virtual int Id {get;set;}
  public virtual string P4 {get;set;}
  public virtual string P5 {get;set;}
  public virtual string P6 {get;set;}
  public virtual A parent;
}

然后在流畅的映射中,您需要添加以下内容

public AMap()
{
  /* mapping for id and properties here */
  HasOne(x => x.child)
      .Cascade.All();
}

public BMap()
{
  /* mapping for id and properties here */
  References(x => x.parent)
      .Unique();
}

请注意,其中的一对多映射BMap标记为Unique。如果您使用 NHibernate 生成 DB 模式,这将用于创建唯一列约束。

要创建新记录,您可以编写如下内容:

    using (var transaction = session.BeginTransaction())
    {
        var classA = new A();
        classA.child = new B() { parent = classA};

        session.Save(owner);
        transaction.Commit();
    }

最后一个警告,NHibernate 的当前版本 3.4 不支持对孤立的一对一的级联删除。有关错误报告,请参见此处。这意味着如果您编写类似session.Delete(classA);的内容,则不会自动删除关联的 B 类记录。

于 2013-03-31T00:39:10.833 回答