禁用更新子类的可能性

时间:2014-08-13 17:05:36

标签: c# nhibernate fluent-nhibernate subclass table-per-subclass

我正在用流利的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有这种功能吗?它有意义吗?

编辑:额外的explenation 我想做这样的事情的原因是,在我的系统(asp mvc应用程序)中,我们有两个不同的地方管理objectsA和objectsB。首先我们创建对象A,然后我们想要转换&#39;对象A到对象B.然后我们可以在两个不同的模块中编辑这两个对象。

我的编辑对象B的流程: - 从db中读取objectB,将其转换为viewmodel -post form from view,将视图数据从表单转换为objectB并在db。中更新。

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

我认为如果能够标记这些数据无法由Session.SaveorUpdate(objectB)更新,那么它将解决我的问题。基本上这就是我的问题。

1 个答案:

答案 0 :(得分: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,并且仅包含值不为null的列。

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

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

但总的来说:简单地把它留给NHibernate吧。它的作用很可能是我们应该要求的最好的......它是一个成熟的工具

EXTEND

根据扩展的问题 - 我会说:就这样......不要。

使用ORM工具,如果您的模型,业务领域模型保持尽可能简单,您将获得很多收益。 NHibernate可以帮助很多东西,例如:

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

但它不会帮助你管理&#34;意外&#34;或&#34;例外&#34;领域模型设计。

请阅读:

  

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