Создавайте поля типа денег, используя сначала код EF CTP5

В этом сообщении блога: EF4 Code First Control Unicode и Decimal Precision, масштабирование с помощью атрибутов, Дейн Моргридж использовал атрибуты для управления созданием различных типов в вашей базе данных.

...И я нашел это довольно уникальное BTW!!!

Как мне сгенерировать поля денежного типа в результирующей базе данных, используя первый код API EF CTP5, если это возможно сделать из вашей модели, используя соглашения или атрибуты?

Извините, что мой английский не является моим основным языком.

Заранее спасибо.


person Ramón García-Pérez    schedule 28.01.2011    source источник
comment
В общем (и если вы не работаете с существующей схемой базы данных), я бы избегал использования типа данных SQL money. Вам лучше использовать десятичные дроби с определенной точностью и масштабом, которые соответствуют требованиям вашего приложения.   -  person Damien_The_Unbeliever    schedule 28.01.2011
comment
@Дэмиен, интересно... почему?   -  person Ilia G    schedule 21.06.2011
comment
Связано с работой с миграциями EF с параметрами денежного типа: Миграция структуры сущности alterstoredprocedure, как представить "> stackoverflow.com/questions/27696728/   -  person Jon Schneider    schedule 27.10.2015


Ответы (2)


Например, рассмотрим этот класс Invoice:

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; }
}
person Morteza Manavi    schedule 28.01.2011
comment
К сожалению, EF 4.3 (релизная версия) игнорирует тип данных money и вместо этого создает десятичное (18,0) определение (не учитывает атрибут Column и конфигурации HasColumnType). Это определенно ошибка. - person George Chakhidze; 16.02.2012
comment
В EF 4.3.1 устранена проблема, из-за которой не учитывался атрибут столбца. Использование [Column(TypeName=Money)] теперь работает должным образом. blogs.msdn.com/b/adonet/archive/2012/02/29/ - person Richard Reddy; 04.03.2012

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; }
person Kim Tranjan    schedule 28.01.2011
comment
BinaryPropertyConfiguration не имеет члена HasColumnType, я пробую этот подход, но он не работает - person Ramón García-Pérez; 29.01.2011
comment
Извините, правильная конфигурация. ColumnType = Money;. Я просто редактирую пост. Спасибо. - person Kim Tranjan; 29.01.2011
comment
ахахаха, боже мой, мне очень жаль, моя вина.. сообщение отредактировано, и теперь это должно работать.. спасибо, приятель - person Kim Tranjan; 29.01.2011
comment
Я думал, что соглашения EF были удалены из Code First до выпуска? - person Chris Moschini; 03.06.2012
comment
Соглашение было удалено в версии 4.1. Возможно, в будущем выпустят. - person Kim Tranjan; 05.06.2012