2

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

class Foo { public List<ValType> Vals; }
class Bar { public List<ValType> Vals; }

Foo 和 Bar 除了它们都包含这些 val 之外是无关的。ValTypes 的添加、删除等规则对于每个类都不同。我想将此设计保留在我的代码中。

例如,有时我想将一些 Vals 从 Foo 复制到 Bar。在数据库中,每个 ValType 都有自己的表,以保持它小而轻(它只有父 ID + 2 个字段),并允许完整性检查。我知道 NHibernate 说我应该让我的对象像数据库一样细化,但这只会让我的代码更丑陋。

到目前为止,我想到的最好的方法是为 ValType 创建单独的子类,每个父类一个。然后我可以在那个级别映射那些。然后,我将连接添加和删除逻辑以在正确的子类之间自动转换,并将它们实际存储在具有正确子类类型的私有列表中。但这似乎有点令人费解。

我如何在 NHibernate 中映射它(如果可能的话,流利的 NHibernate)?

请让我知道这是否是重复的——我不太确定如何搜索它。

4

2 回答 2

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");

希望这是有道理的...

于 2009-03-30T19:47:55.703 回答
2

您可以在Google 代码页面上找到 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 将这两个表视为一个实体。

于 2009-04-21T13:16:47.687 回答