【问题标题】:How do I create a Fluent nHibernate component mapping with data from another table如何使用来自另一个表的数据创建 Fluent nHibernate 组件映射
【发布时间】:2011-06-21 06:30:54
【问题描述】:

我在设置 Fluent nHibernate 映射时遇到了一些困难,我试图使用 Component 函数来构建一个包含来自两个相关数据库表的数据的对象。

以下是数据库和代码的简化版本,概述了我遇到的基本问题。

我的数据库设置类似于以下内容:

Account
  - AccountId INT (PRIMARY KEY)
  - Currency VARCHAR(3)

SubAccount
  - SubAccountId INT (PRIMARY KEY)
  - AccountId INT (FOREIGN KEY reference to Account)
  - Balance DECIMAL

我正在尝试将此数据映射到以下类:

public class Account
{
    public virtual int Id { get; private set; }
    public virtual string Currency { get; private set; }
}

public class SubAccount
{
    public virtual int Id { get; private set; }
    public virtual Account Account { get; private set; }
    public virtual Money Balance { get; private set; }
}

Money 类看起来像:

public class Money
{
    public decimal Value { get; private set; }
    public string Currency { get; private set; }
}

我正在努力解决的部分是我试图将 SubAccount.BalanceAccount.Currency 值映射到 SubAccount.Balance Money 对象.

我的映射类(如下)完成了大部分工作,但我不知道如何使用 SubAccount 中的 Balance 值构建 Balance 对象 em> 表和 Account 表中的 Currency 值。

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Table("Account");

        Id(x => x.Id)
            .Column("AccountId");
        Map(x => x.Currency)
            .Column("Currency");
    }
}

public class SubAccountMap : ClassMap<SubAccount>
{
    public SubAccountMap()
    {
        Table("SubAccount");

        Id(x => x.Id)
            .Column("AccountId");
        References(x => x.Account)
            .Column("AccountId");

        Component(x => x.Balance,
            m =>
            {
                m.Map(y => y.Value)
                    .Column("Balance");

                m.Map(y => y.Currency)
                    .Column("Account.Currency"); // <-- This is where I get stuck
            });
    }
}

我正在尝试使用 Fluent nHibernate 做什么?

【问题讨论】:

  • 仅供参考,您最好不要将货币作为字符串类型,而是将其作为单独的表格。这样您的 Account 实体中就不会出现不必要的货币值重复。
  • 连接 (nhforge.org/doc/nh/en/index.html#mapping-declaration-join) 在您的情况下会有所帮助,但不幸的是,它很可能不允许在组件中使用。是否可以修改您的数据库。架构?
  • 在不久的将来真的不可能修改架构。我尝试使用连接,但发现,正如您提到的,它不允许使用组件功能进行这种配置。

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

我不认为这是可能的,但有一个解决方法:

public class SubAccount
{
    public virtual int Id { get; private set; }
    public virtual Account Account { get; private set; }
    protected virtual decimal Value { get; set; }
    public virtual Money Balance { get { return new Money(Value, Account.Currency); } }
}

public class SubAccountMap : ClassMap<SubAccount>
{
    public SubAccountMap()
    {
        Table("SubAccount");

        Id(x => x.Id)
            .Column("AccountId");
        References(x => x.Account)
            .Column("AccountId");

        Map(Reveal.Property<decimal>("Value"));
    }
}

【讨论】:

  • 感谢您的想法 - 我目前有一个类似的解决方法,唯一的区别是我缓存了结果。如果这种配置是不可能的,那会有点烦人,让事情变得比我想要的更混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2011-06-06
相关资源
最近更新 更多