流畅的Hibernate一对一映射问题

时间:2014-10-08 10:09:02

标签: c#-4.0 nhibernate fluent-nhibernate fluent

我不确定如何在给定的实体下面进行映射。

以下是表格。

Employee { ID, Name, Role_ID } (Role_ID is foreign key from Role table)
Role     {Role_ID, Name }    

以下是课程:

class Employee
{
     public virtual string ID { get; set; }
     public virtual string Name { get; set; }
     public virtual Role EmpRole { get; set; }
}

class Role
{
     public virtual string RoleID { get; set; }
     public virtual string Name { get; set; }
}

以下是映射:

  public class EmployeeMap : ClassMap<Employee>
  {
    public EmployeeMap()
    {
        Table("Employee");
        Id(x => x.ID, "ID");
        Map(x => x.Name, "NAME");
        //for relationship not sure which mapping to be used???  

    }
  }

  public class RoleMap : ClassMap<Role>
  {
    public RoleMap()
    {
        Table("Role");
        Id(x => x.RoleID, "ROLE_ID");
        Map(x => x.RoleID, "ROLE_ID");
        Map(x => x.Name, "ROLE_NAME");
        //For relationship not sure what to be used???? 
    }
  }

场景:一个员工将拥有一个角色。可以将一个角色分配给多个员工。

请建议我如何写两个实体的关系?

1 个答案:

答案 0 :(得分:0)

您正面临最常见的情况。在这种情况下,映射为many-to-one,其流利用 .References()

表示
public EmployeeMap()
{
    Table("Employee");
    Id(x => x.ID, "ID");
    Map(x => x.Name, "NAME");
    References(x => x.EmpRole , "Role_ID");
}

最佳概述(我知道)可在此处获取:

Adam Bar的

Mapping-by-Code - ManyToOne

令人惊讶的是,这篇文章不是关于流畅的NHibernate,而是关于按代码映射。然而,下半年与流利相比 - 并提供真正全面的overivew。小片段:

References(x => x.PropertyName, "column_name")
    .Class<ClassName>()
    .Cascade.SaveUpdate()
    .Fetch.Join()
    .Update()
    .Insert()
    .ReadOnly()
    .Access.Field()
    .Unique()
    .OptimisticLock()
    .LazyLoad(Laziness.Proxy)
    .PropertyRef(x => x.PropertyRef)
    .NotFound.Ignore()
    .ForeignKey("column_fk")
    .Formula("arbitrary SQL expression")
    .Index("column_idx")
    .Not.Nullable()
    .UniqueKey("column_uniq");

如果你要搜索NHibernate doc(流利的操作在它上面)你应该检查:

5.1.10. many-to-one

如果你想要Fluent-NHibernate doc:

最后,如果您想查看哪些员工属于每个角色,您可以扩展您的POCO:

class Role
{
     public virtual string RoleID { get; set; }
     public virtual string Name { get; set; }
     public virtual IList<Employee> Employees { get; set; }
}

并将其映射为<bag>

HasMany(x => x.Employees)
   .KeyColumn("Role_ID")
   .Inverse()
   .BatchSize(25)

请参阅: