Работающие беглые отображения NHibernate делают недопустимым SQL CreateSchema - PullRequest
1 голос
/ 28 июня 2011

Я унаследовал несколько отображений Fluent NHibernate, которые все в настоящее время работают в проекте, в котором они находятся (т.е. приложение использует их и работает). Сейчас я пытаюсь построить интеграционные тесты для некоторых новых отображений и, таким образом, использовать все их - старые и новые - для генерации схемы, используя

new SchemaExport(Container.Resolve<Configuration>()).Create(true, true);

Однако выполняемый сценарий SQL имеет недопустимый код. Кажется, большая часть проблемы проистекает из строк, как в одном из этих двух случаев:

// x.Map is string
Map(x => x.Map).Column("Karta").Not.Nullable().Default("False");
// x.Active is bool
Map(x => x.Active).Column("Aktiv").Not.Nullable().Default("True");

Что происходит, в операторе, который создает эту таблицу, строка, соответствующая приведенному выше отображению, выглядит следующим образом (на самом деле они для разных типов и в разных таблицах):

Karta NVARCHAR(255) default False  not null,
Aktiv BIT default True  not null,

, где (очевидно) False не работает, поскольку переменная с таким именем отсутствует, а логические значения не существуют в SQL Server.

Как мне решить эту проблему?

Я не хочу менять сопоставления, так как существует большое приложение, которое использует их и зависит от них - я не знаю (и не хочу сейчас выяснять) какие тонкие ошибки вводятся, если я, скажем, удаляет спецификацию по умолчанию. Если я смогу изменить "False" и "True" на что-то, что работает, то это вполне нормально - при условии, что совершенно очевидно, что это не изменит никакого поведения в другом месте.

1 Ответ

1 голос
/ 09 июля 2011

Можно изменить .Default, приложение не получает значения по умолчанию из сопоставлений, приложение получает значение по умолчанию из языка по умолчанию свойства свойства (string = null, int = 0, bool = false и т. Д.), Если свойство имеет значениене инициализируется в конструкторе или инициализаторе свойства (C # 3).

FNH. По умолчанию имеет отношение только к созданию DDL, это не повлияет на поведение приложения.

Можно изменить их на это:

Map(x => x.Map).Not.Nullable().Default("'True'");
Map(x => x.Aktiv).Not.Nullable().Default("0");

Я очень сомневаюсь, что ваша команда тесно связывает функциональность вашего приложения с NH, слишком сложно получить значение по умолчанию для свойства приложения из NH по умолчанию или FNH по умолчанию, даже если для этого есть API.Лучший способ узнать это - спросить свою команду, сделали ли они это.

...