【问题标题】:nhibernate mapping, map value to keynhibernate映射,将值映射到键
【发布时间】:2013-05-06 21:41:40
【问题描述】:

假设我有两张桌子:

Tasks
  -TaskName
  -CategoryID

Categories
  -ID
  -Name

现在,假设我有一堂课:

Task
  string Name
  string Category   

如何映射它,以便当我保存任务对象时,它将查找给定类别名称的类别 ID 并将其存储在 CategoryID 字段中?

是否可以使用 Fluent nHibernate 进行映射?

【问题讨论】:

  • 输入的分类名称不存在怎么办?这是可行的(使用property-ref),我可以帮助你编写代码,但我认为这不是一个好的域设计。
  • 如果类别名称不存在,则为错误。这种设计的原因是,一方面有一个公开的 api 公开“可读”值,另一方面有一个充满内部 id 的遗留数据库。我很乐意为您展示一个示例映射,但我一定会查看“property-ref”。
  • 您不应该将您的内部域模型公开为公共 API,也不应该让 NHibernate 一路崩溃并崩溃。相反,使用适当的类别引用(由 id 映射)创建域模型并按名称执行查询。如果没有返回结果,可以返回错误。
  • 嗯,这是我们在这里尝试做的一部分 - 以尽可能少的努力隐藏内部。这些类别是众所周知的类别 - 不是我们领域的一部分。如果 nHibernate 可以为我们做到这一点,我认为没有理由在我们的代码中添加额外的逻辑。因此,如果我希望 nHibernate 为我执行该查询,并在失败时返回错误 - 我将如何映射它?
  • 先把我之前说的改掉。这是不可能的。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

这是不可能的,也不建议有一个 domain Task 类设计成这样(它可以通过名称引用 Category,但你'd 必须在 Task 表中存储名称而不是 ID)

相反,您需要将公共 API 与内部域模型分开:

class Domain.Task
{
    //From your description, I'm assuming this is an assigned unique id, even though
    //that's not great either
    public virtual string TaskName { get; set; }
    public virtual Category Category { get; set; }
}

class Domain.Category
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
}

class API.Task
{
    public string Name { get; set; }
    public string Category { get; set; }
}

以及接收任务的方法:

public void CreateTask(API.Task task)
{
    session.Save(new Domain.Task
                 {
                     TaskName = task.Name,
                     Category = session.Query<Category>()
                                       .Single(x => x.Name == task.Category)
                 });
}

最终结果正是你想要的:任务按名称接收类别,如果类别不存在则抛出错误。

【讨论】:

  • 是的,这就是我们最终的结果。当谈到分离 api 与域时,这正是我们正在做的事情。我们正在按照 api 应有的方式设计 api,即使它不适合我们的内部域模型。中间会有某种映射,我希望 nhibernate 可以为我们做这种映射。我认为在层之间“填充”更多的代码是没有意义的。只要 API 解决了,以后如有必要,您随时可以将中间的部分变得更复杂。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多