【问题标题】:Fluent NHibernate One-to-One mappingFluent NHibernate 一对一映射
【发布时间】:2013-03-30 23:14:57
【问题描述】:

我很难利用 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;}
}

【问题讨论】:

  • 为什么Employee不继承PersonEmployeePerson 的一种类型。然后你可以在映射这些类时使用 NHibernate 的继承工具。
  • 你好笔筒。你可能是对的,但我猜我的问题是错误的。这是我真正想做的事情。表 A 具有属性 Id,p1,p2,p3。表 B 具有属性 Id,p4,p5,p6。表 A 中的每条记录在表 B 中最多可以有一个匹配记录,但也可以没有。它基本上是一对一的关系(准确地说是零或一)。
  • 您有其他角色的表格吗?如果是这样,您如何确定一个人是员工而不是承包商?这是通过表中存在的记录来完成的,例如 Employee 表?或者,在 Person 表中是否有一个列来标识人员的角色?请您使用此信息更新您的问题。
  • 我确实编辑了我的问题笔夹。您不必再将其视为人与员工的关系。它只是一个表A(主表)和表B,可以看起来像表A的扩展。它是一对一的记录关系。很抱歉弄乱了我最初的例子。
  • 抱歉在我发帖之前没有看到更新的问题。

标签: c# nhibernate fluent-nhibernate one-to-one


【解决方案1】:

要使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 不支持对孤立的一对一的级联删除。有关错误报告,请参阅 here。这意味着如果你写session.Delete(classA); 之类的东西,那么相关的 B 类记录将不会被自动删除。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多