29

In this blog post: EF4 Code First Control Unicode and Decimal Precision, Scale with Attributes, Dane Morgridge used attributes to control the creation of different types on your database.

...And I found this pretty unique BTW!!!

How do I generate money type fields in my resulting database using code first API of EF CTP5, if is possible to do it from your model, using conventions or attributes?

Sorry about my English is not my main language.

Thanks in advance.

Ramón García-Pérez
  • 1,880
  • 2
  • 20
  • 25
  • 2
    In general (and unless you're working with an existing database schema), I'd avoid using the SQL money datatype. You're better off using decimals with specific precision and scale that meet your application requirements – Damien_The_Unbeliever Jan 28 '11 at 15:31
  • 2
    @Damien interesting... why is that? – Ilia G Jun 20 '11 at 20:20
  • Related, for working with EF migrations with money-type params: http://stackoverflow.com/questions/27696728/dbmigration-alterstoredprocedure-entity-framework-migration-how-to-represent – Jon Schneider Oct 27 '15 at 14:50

2 Answers2

54

For example, consider this Invoice class:

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

You can do it with fluent API:

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

Or you can do it with Data Annotations:

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

    [Column(TypeName="Money")]
    public decimal Amount { get; set; }
}
Morteza Manavi
  • 33,026
  • 6
  • 100
  • 83
  • Unfortunately, EF 4.3 (release version) ignores money data type and creates decimal(18,0) definition instead (Does not honor Column attribute and HasColumnType configurations). This definitely is a bug. – Giorgi Chakhidze Feb 16 '12 at 09:10
  • 5
    EF 4.3.1 fixed this issue where the Column attribute was not being honoured. Using [Column(TypeName="Money")] works as expected now. http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx – Richard Reddy Mar 04 '12 at 08:01
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";
    }
}

then you use like that

[Money]
public decimal Value { get; set; }
Kim Tranjan
  • 4,521
  • 3
  • 39
  • 38