2011-01-28 9 views
20

En esta publicación de blog: EF4 Code First Control Unicode and Decimal Precision, Scale with Attributes, Dane Morgridge utilizó atributos para controlar la creación de diferentes tipos en su base de datos.Generar campos de tipo de dinero usando el código primero EF CTP5

... Y encontré esto bastante único por cierto !!!

¿Cómo puedo generar campos de tipo de dinero en mi base de datos resultante utilizando el código de la primera API de EF CTP5, si es posible hacerlo desde su modelo, utilizando convenciones o atributos?

Lo siento, mi inglés no es mi idioma principal.

Gracias de antemano.

+2

En general (ya menos que esté trabajando con un esquema de base de datos existente), evitaría usar el tipo de datos SQL money. Es mejor utilizar decimales con precisión y escala específicas que cumplan con los requisitos de su aplicación –

+2

@Damien interesante ... ¿por qué? –

+0

Relacionados, para trabajar con migraciones EF con params tipo dinero: http://stackoverflow.com/questions/27696728/dbmigration-alterstoredprocedure-entity-framework-migration-how-to-represent –

Respuesta

40

Por ejemplo, considere esta clase de factura:

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

Usted puede hacerlo con API fluida:

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

O puede hacerlo con anotaciones de datos:

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

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

Desafortunadamente, EF 4.3 (versión de lanzamiento) ignora el tipo de datos monetarios y crea una definición decimal (18,0) en su lugar (no respeta el atributo Columna y las configuraciones HasColumnType). Esto definitivamente es un error. –

+4

EF 4.3.1 corrigió este problema cuando el atributo Columna no se respetaba. El uso de [Column (TypeName = "Money")] funciona como se espera ahora. http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx –

11
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"; 
    } 
} 

y luego se usa así

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

BinaryPropertyConfiguration no tiene el Miembro de HasColumnType, intento este enfoque pero no funcionó –

+0

Lo sentimos, la configuración correcta es correcta. ColumnType = "Money" ;. Solo edito la publicación. Gracias. –

+0

Todavía no está funcionando ... No sé por qué –

Cuestiones relacionadas