Asp.net Fluent NHibernate将多个模型映射到一个表中
我目前使用一个表来存储两种不同类型的实体,并使用表Asp.net Fluent NHibernate将多个模型映射到一个表中,asp.net,asp.net-mvc,nhibernate,fluent-nhibernate,fluent-nhibernate-test,Asp.net,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Test,我目前使用一个表来存储两种不同类型的实体,并使用表intTypeId 实体公司: public CompanyMap { Table("tblTable"); Id(x => x.Id, "intId"); Map(x => x.TypeId, "intTypeId"); Map(x => x.Name, "strCompanyName");
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");
...
}
我将这两个模型映射到一个表中,它在网页上似乎运行良好,但它破坏了一些持久性规范测试,引发了异常
公司的测试表明,列“strPersonName”
不能为空
,而Person的测试表明,列“strCompanyName”
不能为空
。如果我删除这两个映射中的任何一个,测试就会通过
您能告诉我为什么会发生这种情况吗?有一种方法可以使用鉴别器列来实现这一点,在这种情况下,您可以使用一个基类来映射所有公共列,例如:
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...
}
}
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
}
}
公共类表映射:类映射
{
公共表格地图()
{
表(“tblTable”);
Id(x=>x.Id,“intId”);
//这里我们为区分类型指定列的名称
DiscriminateSubClassesOnColumn(“intTypeId”).Not.Nullable();
映射(x=>x.Name,“strCompanyName”);
//其他栏目。。。
}
}
之后,您只需使用子类映射实现映射,对于每个实体,对于示例:
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...
}
}
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
}
}
公共类公司映射:子类映射
{
上市公司地图()
{
鉴别器值(@“Company”);//鉴别器列的值
}
}
公共类PersonMap:子类映射
{
公众人物地图()
{
鉴别器值(@“Person”);//鉴别器列的值
}
}
看看这篇文章:
基于,我将尝试使用流畅的NH过滤器
假设Company
为intTypeId=1
且Person
为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>();
}
publicpersonmap()
{
表(“tblTable”);
Id(x=>x.Id,“intId”);
Map(x=>x.TypeId,“intTypeId”);
Map(x=>x.Name,“strPersonName”);
ApplyFilter();
}
上市公司地图()
{
表(“tblTable”);
Id(x=>x.Id,“intId”);
Map(x=>x.TypeId,“intTypeId”);
映射(x=>x.Name,“strCompanyName”);
ApplyFilter();
}
最后,不要忘记在会话级别启用过滤器:
session.EnableFilter("CompanyCondition");
session.EnableFilter("PersonCondition");
var persons = session.QueryOver<Person>().List();
var companies = session.QueryOver<Company>().List();
session.EnableFilter(“公司条件”);
session.EnableFilter(“PersonCondition”);
var persons=session.QueryOver().List();
var companys=session.QueryOver().List();
首先感谢您的回答。为此,我需要创建一个包含数据库中所有列的父类,然后让classCompany
和classPerson
从中继承。但是我只需要几个值,而不是我的模型Company
和Person
中的所有列,我该怎么做呢?在这种情况下,我建议您将每个类映射到一个映射类中,而不是尝试将其抽象到一个基本类映射。我为您展示的解决方案是使用鉴别器字段为两个或多个实体使用相同的表进行映射。在我发布的文章中,也有其他基于继承的映射方法,请看:)谢谢您的回答,但我认为这对我测试失败的情况没有帮助?@AlbusShin ok。无论如何,我都会对你的测试感兴趣,因为我看不出这种方法到底有什么失败之处(对我来说,这种方法似乎没有引入层次结构策略那么麻烦)