1

我目前使用一个表来存储两种不同类型的实体,并使用表中的列来区分它们intTypeId

实体公司:

       public CompanyMap
       {
            Table("tblTable");
            Id(x => x.Id, "intId");
            Map(x => x.TypeId, "intTypeId");
            Map(x => x.Name, "strCompanyName");
            ...
       }

实体人:

       public PersonMap
       {
            Table("tblTable");
            Id(x => x.Id, "intId");
            Map(x => x.TypeId, "intTypeId");
            Map(x => x.Name, "strPersonName");
            ...
       }

我将这两个模型映射在一张表中,在网页上似乎运行良好,但它打破了一些持久性规范测试,抛出异常。

Company 的测试说该列"strPersonName"不能NULL,Person 的测试说该列"strCompanyName"不能NULL。如果我删除这两个地图中的任何一个,测试就会通过。

你能告诉我为什么会这样吗?

4

2 回答 2

1

有一种方法可以使用鉴别器列来做到这一点,在这种情况下,您可以有一个基类来映射所有常见的列,例如:

public class TableMap : ClassMap<Table>
{    
   public TableMap()
   {
      Table("tblTable");

      Id(x => x.Id, "intId");

      // here we specify the name of the column for discriminate types
      DiscriminateSubClassesOnColumn("intTypeId").Not.Nullable();

      Map(x => x.Name, "strCompanyName");      
      // other columns...
   }
}

之后,您只需使用SubclassMap<T>, 为每个实体实现映射,例如:

public class CompanyMap : SubclassMap<Company>
{
   public CompanyMap()
   {
       DiscriminatorValue(@"Company");  // value for discriminator column
   }
}

public class PersonMap : SubclassMap<Person>
{
   public PersonMap()
   {
       DiscriminatorValue(@"Person");  // value for discriminator column
   }
}

看看这篇文章: http: //www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat

于 2013-11-25T16:40:08.983 回答
1

基于这个答案,我会尝试使用 Fluent NH 过滤器

假设CompanyisintTypeId=1Personis intTypeId=2,您可以定义两个过滤器类:

public class PersonConditionFilter : FilterDefinition
{
    public PersonConditionFilter()
    {
        WithName("PersonCondition").WithCondition("intTypeId=2");
    }
}

public class CompanyConditionFilter : FilterDefinition
{
    public CompanyConditionFilter()
    {
        WithName("CompanyCondition").WithCondition("intTypeId=1");
    }
}

那么您将在映射中使用这些过滤器:

 public PersonMap()
{
    Table("tblTable");
    Id(x => x.Id, "intId");
    Map(x => x.TypeId, "intTypeId");
    Map(x => x.Name, "strPersonName");
    ApplyFilter<PersonConditionFilter>();
}


public CompanyMap ()
{
    Table("tblTable");
    Id(x => x.Id, "intId");
    Map(x => x.TypeId, "intTypeId");
    Map(x => x.Name, "strCompanyName");
    ApplyFilter<CompanyConditionFilter>();
}

最后,不要忘记在会话级别启用过滤器:

session.EnableFilter("CompanyCondition");
session.EnableFilter("PersonCondition");

var persons = session.QueryOver<Person>().List();
var companies = session.QueryOver<Company>().List();
于 2013-11-26T14:26:05.163 回答