我有一个模型,其中多个类具有值类型列表:
class Foo { public List<ValType> Vals; }
class Bar { public List<ValType> Vals; }
除了他们都包含这些val之外,Foo和Bar是无关的。 ValTypes的添加,删除等规则对于每个类都是不同的。我想在我的代码中保留这个设计。
例如,有时我想将一些Vals从Foo复制到Bar。在数据库中,每个ValType都有自己的表,以保持小,轻(它只有父ID + 2字段),并允许完整性检查。我知道NHibernate说我应该保持我的对象像数据库一样精细,但这只会使我的代码变得更加丑陋。
到目前为止,我所想到的最好的是制作ValType的单独子类,每个父类一个。然后我可以映射那个级别的那些。然后,我将连接添加和删除逻辑以在正确的子类之间自动转换,并实际将它们存储在具有正确子类类型的私有列表中。但这似乎有点令人费解。
如何在NHibernate中映射它(如果可能的话,流利的NHibernate)?
请告诉我这是否重复 - 我不太确定如何搜索。
答案 0 :(得分:3)
在数据库级别,解决方案是:
Val(Id)
Bar(Id)
BarToVal(IdBar, IdVal)
FooToVal(IdFoo, IdVal)
我不太确定这些是如何映射的。也许是这样的:
// BarMap:
HasManyToMany(x => x.Vals).WithTableName("BarToVal");
// FooMap:
HasManyToMany(x => x.Vals).WithTableName("FooToVal");
希望它有意义......
答案 1 :(得分:2)
您可以在Google Code page for Fluent NHibernate上找到示例。
<强>模型强>
public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
}
<强>模式强>
table Customer (
Id int primary key
Name varchar(100)
)
table CustomerAddress (
CustomerID int,
Address varchar(100)
)
<强>映射强>
public class CustomerMap : ClassMap<Customer>
{
public CustomerMap()
{
Id(x => x.Id);
Map(x => x.Name);
WithTable("CustomerAddress", m =>
{
m.Map(x => x.Address);
});
}
}
在此示例中,实体分布在数据库中的两个表中。这些表在其键上以一对一的方式连接在一起。使用WithTable功能,您可以告诉NHibernate将这两个表视为一个实体。