.net EF4将可为空的十进制列映射到不可为空的值属性

.net EF4将可为空的十进制列映射到不可为空的值属性,.net,entity-framework,entity-framework-4,non-nullable,entity-framework-mapping,.net,Entity Framework,Entity Framework 4,Non Nullable,Entity Framework Mapping,我将POCOs(无代理)与EF4一起使用 在数据库中,我有一个可为空的十进制列: <Property Name="AMOUNT" Type="decimal" Precision="12" Scale="2" /> 如果数据库中的值为null,我希望将属性设置为0。我怎样才能做到这一点?我不希望这里有Nullable属性,否则我必须用GetValueOrDefault()code污染我的业务逻辑 [这似乎是我要问的,但我不确定它是否真的得到了回答。]不幸的是,您必须在POCO中使用

我将POCOs(无代理)与EF4一起使用

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

<Property Name="AMOUNT" Type="decimal" Precision="12" Scale="2" />
如果数据库中的值为
null
,我希望将属性设置为
0
。我怎样才能做到这一点?我不希望这里有
Nullable
属性,否则我必须用
GetValueOrDefault()
code污染我的业务逻辑


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

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


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

“对于EDMX,有一种可能的丑陋解决方法。”-这不是一种丑陋的解决方法,而是一种常见做法。实体框架有很多限制,类文件被有意地生成为部分文件,以便您可以向它们添加任何您想要的内容。顺便说一句,创建纯数据类(没有任何逻辑,就像EF生成的那样)是一种反模式。@kubal:这是一种变通方法,因为这种映射逻辑应该是ORM本身的一部分。此外,您的反模式只存在于领域驱动设计的世界中,它被称为贫血领域模型。如果你不遵循域驱动的设计,你就没有反模式。你是对的,我的观点是,由于EF故意支持不能被认为是丑陋的部分类,但是如果你看一下整个设计,那么这肯定不是一种优雅的做事方式。我在做领域驱动的设计,我的POCO是事先手动创建的。因为我试图保持持久性无知,所以我需要在POCO中实现一些特殊的逻辑,这样我的公共金额属性就可以在EF世界中不为null,这让我有点痛苦。我尝试支持另一个持久层,它可以在调用setter之前进行转换。不管是哪种方式,我可能都能接受——你的答案正是我所期待的,所以谢谢。
public decimal Amount { get; set; }