NHibernate:根据父级将同一个类映射到多个表

时间:2009-03-30 19:18:15

标签: nhibernate fluent-nhibernate

我有一个模型,其中多个类具有值类型列表:

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)?

请告诉我这是否重复 - 我不太确定如何搜索。

2 个答案:

答案 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将这两个表视为一个实体。