2011-01-28 14 views
20

W tym poście na blogu: EF4 Code First Control Unicode and Decimal Precision, Scale with Attributes, Dane Morgridge używane atrybuty do kontrolowania tworzenia różnych typów w bazie danych.Generowanie pól typu pieniężnego przy użyciu kodu najpierw EF CTP5

... I znalazłem to całkiem wyjątkowe BTW !!!

Jak wygenerować pola typu pieniężnego w wynikowej bazie danych za pomocą kodu pierwszego interfejsu API EF CTP5, jeśli można to zrobić z modelu, używając konwencji lub atrybutów?

Niestety, mój angielski nie jest moim głównym językiem.

Z góry dziękuję.

+2

Ogólnie (i jeśli nie pracujesz z istniejącym schematem bazy danych), unikałbym używania typów danych SQL. Lepiej używać miejsc dziesiętnych z określoną precyzją i skalą, które spełniają wymagania Twojej aplikacji. –

+2

@Damien ciekawe ... dlaczego tak jest? –

+0

Powiązane, do pracy z migracjami EF z typami pieniężnymi: http://stackoverflow.com/questions/27696728/dbmigration-alterstoredprocedure-entity-framework-migration-how-to-represent –

Odpowiedz

40

Na przykład, rozważmy tę klasę Faktura VAT:

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

można to zrobić z płynną API:

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

Albo można zrobić z danymi Objaśnienia:

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

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

Niestety, EF 4.3 (wersja release) ignoruje typ danych pieniężnych i tworzy definicję dziesiętną (18,0) zamiast (nie honoruje atrybutów kolumn i HasColumnType). To zdecydowanie jest błąd. –

+4

EF 4.3.1 rozwiązało ten problem, gdy atrybut kolumny nie był honorowany. Używanie [Column (TypeName = "Money")] działa zgodnie z oczekiwaniami. 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"; 
    } 
} 

następnie używasz tak

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

BinaryPropertyConfiguration nie ma HasColumnType członek, próbuję tego podejścia, ale nie działa –

+0

Niestety, poprawna jest configuration.ColumnType = "Money" ;. Właśnie edytuję post. Dzięki. –

+0

Nadal nie działa ... Nie wiem dlaczego –