Свободный список строк в NHibernate с помощью nvarchar (max) - PullRequest
2 голосов
/ 14 октября 2011

Я использую Fluent NHibernate 1.2 для NHibernate 3.1.У меня есть класс:

public class Marks
{
    public virtual int Id { get; set; }
    public virtual IList<string> Answers { get; set; }
}

В отображении для класса Marks у меня есть:

HasMany(m => m.Answers).Element("Value");

Когда создаются таблицы, создается таблица «Ответы» со следующимистолбцы:

Marks_id (FK, int, not null)
Value (nvarchar(255), null)

То, что я хотел бы сделать, это иметь значение be nvarchar (max).Я бы предпочел не делать это для каждой строки в каждом классе, только для этого одного класса.

Я просмотрел следующие посты: первый , второй , третий , но пока не нашел ничего, что могло бы помочь.

Заранее благодарим за любую помощь, которую вы можете предложить.Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Редактировать: Этот код решает проблему:

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001);

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

Вы можете принудительно назначить отображение string на более длинный столбец на каждом уровне столбца в отображении, используя CustomSqlType("nvarchar(max)") или, более универсально, установив Length(4001) (магическое число SQL Server, выше которого оно автоматически создает nvarchar(max) ).

Чтобы применить его автоматически ко всем string столбцам в ваших сущностях, вы можете написать собственное Соглашение FluentNHibernate :

public class LongStringConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof(string));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.Length(4001);
    }
}

И зарегистрируйте его в контейнере отображения, например, так:

Fluently.Configure()
    .Mappings(...)
    .Conventions.Add<LongStringConvention>()

Чтобы применить его для сбора строк, вы можете использовать пользовательские сопоставления элементов:

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001);
0 голосов
/ 12 января 2016

Ответы выше работают только для более старой версии nhibernate.Если вы попробуете HasMany(x => x.Answers).Element("Value", x => x.Length(4001));, вы получите следующее:

Ошибка Свойство или индексатор 'FluentNHibernate.MappingModel.ColumnMapping.Length' не могут быть назначены - оно доступно только для чтения

правильный способ сделать это сейчас (NHibernate 4.0.2.4, FluentNHibernate 2.0.1.0):

HasMany(m => m.Answers).Element("Value", e => e.Length(4001))
0 голосов
/ 08 мая 2013

Я сталкивался с этой проблемой сам, и приведенные выше ответы были наиболее полезны, чтобы указать мне правильное направление ... но я использую немного более новую версию FluentNH.

Для Fluent NHibernate 1.3 и NH 3.3.1, правильный код:

HasMany(x => x.Answers).Element("Value", x => x.Length(4001));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...