【问题标题】:EF4 mapping nullable decimal column to non-nullable value propertyEF4 将可空十进制列映射到不可空值属性
【发布时间】:2011-10-08 00:17:12
【问题描述】:

我在 EF4 中使用 POCO(无代理)。

在数据库中,我有这个可以为空的十进制列:

<Property Name="AMOUNT" Type="decimal" Precision="12" Scale="2" />

在我的 POCO 上,我有这个不可为空的值属性:

public decimal Amount { get; set; }

如果数据库中的值为null,我希望将属性设置为0。我怎样才能做到这一点?我不想在这里有Nullable 属性,否则我必须用GetValueOrDefault() 代码污染我的业务逻辑。

[这个question 似乎是我要问的,但我不确定它是否真的得到了回答。]

【问题讨论】:

    标签: .net entity-framework entity-framework-4 non-nullable entity-framework-mapping


    【解决方案1】:

    不幸的是,您必须在 POCO 中使用可为空的小数,因为 EF 不提供任何简单的类型映射/类型转换器,您可以在其中放置转换逻辑。类型必须相同才能正常工作。

    在 EDMX 的情况下,有一种可能的丑陋解决方法。您可以将列映射到非公共属性并公开另一个不会映射的公共属性(在 POCO 类的部分部分中),并且您将在其 getter 和 setter 中拥有转换逻辑。 Here 描述了如何更改属性的可见性。

    【讨论】:

    • “在 EDMX 的情况下,有一种可能的丑陋解决方法。” - 这不是一个丑陋的解决方法,而是一种常见的做法。实体框架有很多限制,并且类文件是有意生成的部分文件,以便您可以添加任何您想要的内容。顺便说一句 - 创建纯数据类(没有任何逻辑 - 就像 EF 生成的那些)是一种反模式。
    • @kubal:这是一种解决方法,因为这个映射逻辑应该是 ORM 本身的一部分。此外,您的反模式仅存在于领域驱动设计的世界中,它被称为贫血领域模型。如果你不遵循领域驱动设计,你就没有那种反模式。
    • 你说得对,我的意思是,因为 EF 有意支持不能被视为丑陋的部分类,但如果你看一下整个设计,那么这肯定不是优雅的做事方式.
    • 我正在做领域驱动设计,我的 POCO 是事先手动创建的。由于我试图保持对持久性的无知,所以我需要在我的 POCO 中实现一些特殊的逻辑,以便我的公共 Amount 属性可以是不可为空的 - 在 EF 世界中,这让我有点痛苦。我有另一个我正在尝试支持的持久层,它可以在调用 setter 之前进行转换。无论哪种方式,我都可以忍受 - 你的答案是我所期待的,所以谢谢。
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多