Почему Fluent NHibernate ВСЕГДА создает текстовое поле из свойства C # String как DEFAULT? - PullRequest
2 голосов
/ 08 января 2011

Я запускаю этот пример здесь: https://github.com/jagregory/fluent-nhibernate/blob/master/src/Examples.FirstProject/Program.cs

Все свойства C # типа String сопоставляются с полями TEXT sql, а не

nvarchar ИЛИ varchar, как я хотел бы, за исключением того, чтобы быть как DEFAULTнастройка.

Как я могу это изменить?

Я знаю, что могу сделать это:

Map(x => x.Name).CustomSqlType("nvarchar").Length(50); // does not work !!!
Map(x => x.Name).CustomSqlType("nvarchar (50)"); // does work !!!

, но я не хочу менять каждое поле ...

ОБНОВЛЕНИЕ: ... поэтому я могу сделать пользовательское соглашение через =>

Что мне нужно сделать, это написать собственный класс Конвенции, например:

public class ColumnStringToNVarCharConvention : IPropertyConvention, IPropertyConventionAcceptance
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.CustomSqlType("nvarchar");
        }

        public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
        {
            criteria.Expect(x => x.Property.GetType().Equals(typeof(string)));
        }
    }

Может ли кто-нибудь исправить приведенный выше код?Я проверил это, и оно не сработало ...

Ответы [ 2 ]

5 голосов
/ 09 января 2011

Вы используете SQLite, правильно? Вот в чем ваша проблема. Это лучше описано в этом ответе на другой пост , но SQLite не имеет типов данных в том же смысле, что и другие базы данных. Это не проблема Fluent NHibernate, а способ, которым NHibernate работает с базой данных, почти не содержащей данных.

Для более строгих баз данных Fluent NHibernate по умолчанию использует более разумные типы данных. Это зависит от базы данных, но это будет nvarchar для строк.

0 голосов
/ 08 января 2011

Вы можете попробовать проверить, к какому уровню совместимости относится база данных, к которой вы подключаетесь. Если для него задано слишком низкое значение (80), это может быть значение по умолчанию для текста, поскольку NTEXT не устарел до SQL2005, то есть уровня совместимости 90. Это не гарантия, просто возможная мысль.

Это инструкция MSDN для проверки на уровень совместимости ...

Для просмотра или изменения совместимости уровень базы данных

После подключения к соответствующему экземпляр базы данных SQL Server Engine, в обозревателе объектов, нажмите имя сервера для расширения дерева серверов.

Расширить базы данных и, в зависимости от базы данных, либо выберите пользователя базы данных или расширить системные базы данных и выберите системную базу данных.

Щелкните правой кнопкой мыши базу данных, а затем нажмите Свойства.

Диалоговое окно Свойства базы данных открывается.

В панели выбора страницы нажмите Параметры.

Текущий уровень совместимости отображается на уровне совместимости список.

Чтобы изменить уровень совместимости, выберите другой вариант из список. Выбор SQL Server 2000 (80), SQL Server 2005 (90) или SQL Сервер 2008 (100).

В SQLite есть только 5 типов данных, один из которых является строкой.

http://www.sqlite.org/c3ref/c_blob.html

Каждое значение в SQLite имеет одно из пяти основные типы данных:

64-разрядное целое число со знаком
64-разрядное число с плавающей точкой IEEE
строка
BLOB
NULL

Эти константы являются кодами для каждого из эти типы.

Обратите внимание, что константа SQLITE_TEXT была также используется в SQLite версии 2 для совершенно другое значение. Программного обеспечения что ссылки на обе версии SQLite 2 и SQLite версии 3 должны использовать SQLITE3_TEXT, а не SQLITE_TEXT.

...