Колонки FluentNHibernate и VARCHAR - PullRequest
       18

Колонки FluentNHibernate и VARCHAR

6 голосов
/ 16 августа 2010

Я запускаю простой проект .NET с FluentNhibernate .
Я следовал нескольким примерам, которые нашел в Интернете, и это довольно легко понять.
Я понял, что если я позволю FluentNhibernate построить мою схему БД (Sql Server 2000), он генерирует поля NVARCHAR для моих свойств модели строк.

Кто-то предложил мне добавить соглашение для изменения типа.

Этот бит кода прекрасно работает:

public class AnsiStringConvention : IPropertyConvention 
        {
            private static Type stringType = typeof(string);
            public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance)
            {
                if (instance.Property.PropertyType == stringType)
                {
                    instance.CustomType("AnsiString");
                }
            }
        }

Теперь мои поля БД - VARCHAR, как я и ожидал.
Мне нужно было добавить компонент в мой класс, следуя шаблону DDD, который я поместил адрес в отдельном классе и добавил его в мой класс Customer.
Я создал отдельный файл сопоставления для адреса:

public class AddressMap : ComponentMap<Address>
{
    public AddressMap()
    {
        Map(x => x.Number);
        Map(x => x.Street)
            .Length(100);
        Map(x => x.City)
            .Length(50);
        Map(x => x.PostCode)
            .Length(5);
    }
}

Теперь все поля моей таблицы Customer являются VARCHAR, но поля компонента Address (Street, City и PostCode) по-прежнему создаются как NVARCHAR.

1 Ответ

11 голосов
/ 26 августа 2010

Нашел решение, определяющее AnsiString как CustomType:

public class AddressMap : ComponentMap<Address>
{
    public AddressMap()
    {
        // this.Map(x => x.Number);
        this.Map(x => x.Street)
            .CustomType("AnsiString") 
            .Length(100);
        this.Map(x => x.City)
            .CustomType("AnsiString")
            .Length(30);
        this.Map(x => x.State)
            .CustomType("AnsiString")
            .Length(20);
        this.Map(x => x.PostalCode)
            .CustomType("AnsiString")
            .Length(10);
        this.Map(x => x.Country)
            .CustomType("AnsiString")
            .Length(40);
    }
}
...