2011-01-28 9 views
20

In questo post del blog: EF4 Code First Control Unicode and Decimal Precision, Scale with Attributes, Dane Morgridge attributi utilizzati per controllare la creazione di diversi tipi sul database.Genera campi tipo di denaro utilizzando prima il codice EF CTP5

... E ho trovato questo BTW piuttosto unico !!!

Come faccio a generare campi tipo denaro nel mio database risultante utilizzando la prima API code di EF CTP5, se è possibile farlo dal modello, utilizzando convenzioni o attributi?

Mi dispiace per il mio inglese non è la mia lingua principale.

Grazie in anticipo.

+2

In generale (ea meno che non si stia lavorando con uno schema di database esistente), eviterei di utilizzare il tipo di dati di denaro SQL. Stai meglio usando i decimali con precisione e scala specifiche che soddisfano i requisiti delle tue applicazioni –

+2

@Damien interessante ... perché? –

+0

Correlati, per lavorare con le migrazioni EF con parametri di tipo money: http://stackoverflow.com/questions/27696728/dbmigration-alterstoredprocedure-entity-framework-migration-how-to-represent –

risposta

40

Ad esempio, si consideri questa classe Invoice:

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

si può fare con API fluente:

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

o si può farlo con annotazioni dati:

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

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

Sfortunatamente, EF 4.3 (versione di rilascio) ignora il tipo di dati di denaro e crea invece la definizione decimale (18,0) (non considera l'attributo Column e le configurazioni HasColumnType). Questo è sicuramente un bug. –

+4

EF 4.3.1 risolto questo problema in cui l'attributo della colonna non veniva rispettato. L'utilizzo di [Column (TypeName = "Money")] funziona come previsto ora. 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"; 
    } 
} 

quindi utilizzi così

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

BinaryPropertyConfiguration non ha il Membro di HasColumnType, provo questo approccio ma non ha funzionato –

+0

Spiacente, la corretta è configuration.ColumnType = "Money" ;. Ho appena modificato il post. Grazie. –

+0

Ancora non funziona ... Non so perché –

Problemi correlati