Как я заставляю быстрый nhibernate создавать varbinary (макс.) поле в SQL-сервере

Это идет что-то как:

from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}

было бы хорошо иметь разумные имена и поля для Ваших таблиц для лучшего примера.:)

Обновление

я думаю для Вашего запроса, это могло бы быть более соответствующим:

var dealercontacts = from contact in DealerContact
                     join dealer in Dealer on contact.DealerId equals dealer.ID
                     select contact;

, Так как Вы ищете контакты, не дилеров.

14
задан Matthew Groves 8 July 2009 в 14:30
поделиться

4 ответа

Я не уверен, почему ваш пример ActiveRecord не работает, но вы можете попробовать установить длину столбца.

Используя Fluent NHibernate, вы должны иметь возможность

Map(x => x.FileData)
    .WithLengthOf(2147483647)
10
ответ дан 1 December 2019 в 13:09
поделиться

Во-первых, я (досадно) поместил файл карты в основной проект, а не в проект данных.

Я все еще не мог заставить его работать с файлом карты, но я вместо этого написал xml-файл, записав длину файла - спасибо за это Дэн

 <property name="FileName"/>
 <property name="FileType"/>
 <property name="VersionNo"/>
 <property name="FileLength"/>
 <property name="FileData" length="2147483647"/>
0
ответ дан 1 December 2019 в 13:09
поделиться

AFAIK, в Fluent NHibernate нет такого понятия, как "max", однако, если вы установите допустимую длину столбца в действительно большое значение, он должен работать нормально. Вы можете посмотреть в MSDN, какое число max означает для каждого типа данных в SQL Server, хотя в других он может означать совсем другое число.

Я использовал reflector и нашел вот это:

public MsSql2005Dialect()
{
    base.RegisterColumnType(DbType.String, 0x3fffffff, "NVARCHAR(MAX)");
    base.RegisterColumnType(DbType.AnsiString, 0x7fffffff, "VARCHAR(MAX)");
    base.RegisterColumnType(DbType.Binary, 0x7fffffff, "VARBINARY(MAX)");
}

Итак, похоже, что NHibernate создает max по умолчанию? Тем не менее, Fluent этого не делает. (Хотя я не знаю почему.)

С помощью функции Auto mapping вы можете использовать соглашения для достижения этого.

Пример:

var cfg = new Configuration();

var persistenceModel = new AutoPersistenceModel();
persistenceModel.Conventions.Add(
    new PropertyConvention(),
    new ReferenceConvention(),
    new HasManyConvention(),
    ConventionBuilder.Property.Always(delegate(IPropertyInstance instance)
    {
        if (instance.Property.PropertyType == typeof(string))
            instance.Length(16000);
        else if (instance.Property.PropertyType == typeof(byte[]))
            instance.Length(30000000);
    }));
persistenceModel.AddTypeSource(new AssemblyTypeSource(Assembly.GetExecutingAssembly()));
persistenceModel.Where(t => t.Namespace.EndsWith("Entities"));

cfg.AddAutoMappings(persistenceModel);
return cfg.BuildSessionFactory();

Для меня этого достаточно, но вы всегда можете использовать большие числа.

Если вы не используете автоматическое отображение, то решение Дэна Фитча - это выход, я думаю.

1
ответ дан 1 December 2019 в 13:09
поделиться

В отображении используйте:

Map (x => x.FileData) .CustomSqlType ("VARBINARY (MAX)");

2
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: