0

我正在开发流利的 nhibernate 中的继承策略。一切正常,但我有一个问题。是否有可能通过子类禁用更新基础属性?

这是一个虚拟代码:

public class ObjectA
{
    public virtual string StatusA { get; set; }
}

public class ObjectB : ObjectA
{
    public virtual string StatusB { get; set; }
}

public class ObjectBMap : SubclassMap<ObjectB>
{
    public ObjectBMap()
    {
        Map(x => x.StatusB);
    }
}

当我更新 objectB 时,我不想更新 StatusA。我想在更新 ObjectA 时更改状态 A。nhibernate有这种功能吗?它有道理吗?

编辑:附加 说明我想做这样的事情的原因是在我的系统(asp mvc 应用程序)中,我们有两个不同的地方来管理objectsA 和objectsB。首先我们创建对象 A,然后我们想将对象 A“转换”为对象 B。然后我们可以在两个不同的模块中编辑这两个对象。

我编辑objectB的流程: -从db读取objectB,将其转换为viewmodel -从视图发布表单,将视图数据从表单转换为objectB并在db中更新。

我不想为对象 A 的数据扩展对象 B 的视图模型,将这些数据存储在一些隐藏字段中并从视图模型转换。

我认为如果可以标记 Session.SaveorUpdate(objectB) 无法更新此数据,它将解决我的问题。所以基本上这就是我的问题。

4

1 回答 1

1

尝试检查文档:

小引用:

<class
    name="ClassName"                              (1)
    table="tableName"                             (2)
    ...
    dynamic-update="true|false"                   (7)
    dynamic-insert="true|false"                   (8)
    ...

...
(7) dynamic-update(可选,默认为 false):指定 UPDATE SQL 应在运行时生成,并且仅包含值已更改的列。
(8) dynamic-insert(可选,默认为false):指定INSERT SQL应该在运行时生成,并且只包含值不为空的列。

我们可以看到,设置"dynamic-update"... 符合我们的预期:仅更新已更改的属性

如果 ObjectA 定义的属性没有变化,这将是学习 NHibernate 以仅向 ObjectB 发布更新的最原生方式。

但总的来说:只需将其保留为 NHibernate。它的作用,很可能是我们应该要求的最好的……它是一个成熟的工具

延长

基于问题扩展- 我会说:不要那样做......不要。

使用 ORM 工具,如果您的模型(业务域模型)尽可能简单,您将获得很多收益。NHibernate 可以帮助解决很多问题,例如:

  • 选择所有或仅部分属性 - 称为投影
  • 寻呼
  • 排序
  • 过滤
  • WRITE 操作的级联
  • 甚至更多...

但它不会帮助您管理“意外”或“异常”的域模型设计。

请阅读这个:

面向对象编程中的组合优于继承 (或组合重用原则)是一种技术,通过该技术,类可以通过包含实现所需功能的其他类而不是通过继承来实现多态行为和代码重用......

于 2014-08-13T17:24:05.970 回答