使用Code First EF CTP5生成货币类型字段

29

2
一般来说(除非您正在使用现有的数据库模式),我建议避免使用SQL货币数据类型。最好使用具有特定精度和比例的小数,以满足您的应用程序要求。 - Damien_The_Unbeliever
2
@Damien 很有意思... 为什么呢? - Ilia G
与使用EF迁移处理货币类型参数相关的内容,请参考以下链接:http://stackoverflow.com/questions/27696728/dbmigration-alterstoredprocedure-entity-framework-migration-how-to-represent - Jon Schneider
2个回答

54

例如,考虑这个发票类:

public class Invoice
{
    public int InvoiceId { get; set; }                
    public decimal Amount { get; set; }
}

你可以使用流畅的API来完成:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Invoice>()
                .Property(i => i.Amount)
                .HasColumnType("Money");
}

或者您可以使用数据注释来完成:

public class Invoice
{
    public int InvoiceId { get; set; }                

    [Column(TypeName="Money")]
    public decimal Amount { get; set; }
}

不幸的是,EF 4.3(发布版本)忽略了货币数据类型,并创建了decimal(18,0)定义(不遵守Column属性和HasColumnType配置)。这绝对是一个错误。 - Giorgi Chakhidze
5
EF 4.3.1修复了一个问题,即不再忽略Column属性。现在,使用[Column(TypeName="Money")]可以按预期工作。http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx - Richard Reddy

12
using System.Data.Entity.ModelConfiguration.Configuration.Properties.Primitive;

public class MoneyAttribute : Attribute { }

public class MoneyAttributeConvention : AttributeConfigurationConvention<PropertyInfo, DecimalPropertyConfiguration, MoneyAttribute> {
    public override void Apply(PropertyInfo memberInfo, DecimalPropertyConfiguration configuration, MoneyAttribute attribute) {
        configuration.ColumnType = "money";
    }
}

然后你就可以像这样使用

[Money]
public decimal Value { get; set; }

1
BinaryPropertyConfiguration没有HasColumnType成员,我尝试了这种方法,但它没有起作用。 - Ramón García-Pérez
抱歉,正确的写法是 configuration.ColumnType = "Money";。我刚刚编辑了帖子。谢谢。 - Kim Tranjan
啊哈哈哈,天哪,我太抱歉了,是我的错。帖子已经编辑过了,现在应该可以工作了。谢谢伙计。 - Kim Tranjan
我认为 EF Conventions 在发布之前就被移除了,不是吗? - Chris Moschini
传统规则已在4.1版本中被删除。可能会在未来发布。 - Kim Tranjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接