【问题标题】:NHibernate: Default value for a property over a null columnNHibernate:空列上的属性的默认值
【发布时间】:2010-07-26 15:58:09
【问题描述】:

我正在使用其他应用程序使用的旧数据库,因此我无法修改其结构。 有时我有可以为空的列,我想将其映射为不可为空的类型。 例如,我在数据库上有一个可以为空的 EndValidity 列,我想将其映射到不可为空的 DateTime 上,如果为空,它应该是 DateTime.MaxValue,或者作为更简单的示例,如果为空,则必须为假的可空位列.

我正在考虑为它编写一个自定义用户类型(如果可能的话,使用参数),或者它是否包含在 nHibernate 中?

如果唯一的解决方案是编写自定义用户类型,对于布尔情况,我可以覆盖 fluentnhibernate 约定以始终将该用户类型应用于布尔值吗?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    这可能取决于你希望你的 poco 类如何行动。 首先,如果您加载一个空值,您是希望重新保存空值还是希望任何会话提交/刷新使用空字段的新默认值更新记录。 如果您想将空值保留在数据库中,您将如何仅使用布尔值从 poco 对象中检测到哪个值来保存 IE 布尔值只有 true 和 false 选项/值,但您的位类具有 null、0 的选项/值和 1?

    如果说:您希望在 poco 类中将可空位作为布尔值而不是可空布尔数据类型,并让该类更新数据库以删除所有空值,那么一种解决方案非常快,无需深入研究自定义类型是在具有基本逻辑的接口(没有任何映射)中拥有两个属性一个可为空和受保护或内部和一个属性 - 出于依赖关系注入所有 poco 类理想情况下具有一个或两个接口: EG

    internal virtual bool? isActive {get;set;}
    public bool MyInterface.IsActive 
    {
        get{ return isActive ?? false; }
        set{ isActive == value ?? false; };
    }
    

    通过这种方式,您的逻辑包含在代码中,因此如果规则变得更加复杂/复杂,或者一个可空位的默认值为 false,而另一个默认值为 true(因为上个世纪的一些疯狂的开发人员),您可以更轻松控制变换。 这将要求您使用接口而不是真正的 poco 类,但这也不是一件坏事,它只取决于您的开发模型。

    【讨论】:

    • 如果我想过滤这个字段,我会告诉 nHibernate 类似where obj.IsActive == false 的内容。过滤是通过internal isActive 属性的映射传递到数据库,还是在.net 中对未过滤的结果进行过滤?
    • 假设您使用的是 Linq,然后在内存中而不是在数据库级别。如果您使用 NHibernate 到 Linq/IQueryOver/ICriteria/HQL,那么我想您会收到运行时错误,因为 IsActive 未映射并且 NHibernate 不知道如何使用它。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多