流畅的NHibernate一对一映射

Dra*_*ski 3 c# nhibernate one-to-one fluent-nhibernate

我很难用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;}
}
Run Code Online (Sandbox Code Playgroud)

mic*_*old 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,一对多映射BMap标记为Unique.如果使用NHibernate生成数据库模式,则用于创建唯一列约束.

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

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

        session.Save(owner);
        transaction.Commit();
    }
Run Code Online (Sandbox Code Playgroud)

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