Укажите значение по умолчанию для строкового поля, используя Fluent NHibernate. - PullRequest
3 голосов
/ 19 марта 2012

У меня проблема с установкой значения по умолчанию для строки с помощью Fluent Nhibernate. У меня есть база данных с полем varchar, которое не является нулевым, и я пытаюсь создать некоторые объекты и затем обновить их до базы данных, однако, поскольку строка может быть нулевой в .Net, у меня возникла проблема при попытке обновить сущность в базу данных.

Я гуглил решение, но пока слово «По умолчанию», по-видимому, встречается во многих смежных темах, поэтому трудно отфильтровать то, что я на самом деле хочу.

Что я хотел бы сделать, так это установить по умолчанию в отображении пустую строку, чтобы вызывающему коду не нужно было знать, что поле базы данных не может быть пустым. Пока что просто установить сопоставление как .Default (string.Empty) не сработало, поэтому я предполагаю, что я делаю это неправильно. Я могу исправить это, добавив вызов конструктора, чтобы установить поле в пустую строку в конструкторе сущностей, но это выглядит довольно неприятно, поэтому я ищу лучший способ сделать это, если он там есть.

Итак, часть кода ...

Entity Property (довольно ванильный):

public virtual string Notes { get; set; }

и отображение:

Map(m => m.Notes).Default(string.Empty).Not.Nullable();

Я также попытался использовать буквальную пустую строку .Default ("") и поместить Not.Nullable () перед значением по умолчанию, и ни один из подходов также не сработал.

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

Любая помощь с благодарностью.

Ответы [ 2 ]

3 голосов
/ 31 октября 2013

У меня также были проблемы с установкой пустой строки в качестве значения по умолчанию. Обратите внимание, что я использую SQLite. После некоторого исследования кажется, что FluentNHibernate генерирует «неправильный» оператор SQL в отношении беглого отображения.

Давайте возьмем

Map(m => m.Notes).Default(string.Empty).Not.Nullable();

или

Map(m => m.Notes).Default("").Not.Nullable();

из вашего примера. Мы ожидаем, что этот SQL:

Notes TEXT DEFAULT "" NOT NULL

но генерирует

Notes TEXT 

Его явно опускают "" в качестве значения по умолчанию. Использование

Map(m => m.Notes).Default(" ").Not.Nullable(); 

результат в

Notes TEXT DEFAULT   NOT NULL

Что еще хуже, потому что его неверный SQL, потому что "" отсутствует.

Использование

Map(m => m.Notes).Default("\"\"").Not.Nullable(); 

генерирует правильный SQL как

Notes TEXT DEFAULT "" NOT NULL

фактически использует пустую строку в качестве значения по умолчанию.

1 голос
/ 19 марта 2012

Установите значение вашего свойства в пустую строку в конструкторе вашего объекта.

.Default(string.Empty) используется только для генерации схемы. При этом значение этого свойства по умолчанию не будет равным пустой строке в вашем объекте.

Edit:

Вы также можете использовать DynamicInsert() в вашем отображении. Поэтому он будет использовать базу данных по умолчанию, если вы не устанавливаете это значение в explicity.

dynamic-insert (необязательно, по умолчанию false): указывает, что INSERT SQL должен генерироваться во время выполнения и содержать только столбцы, чьи значения не равны нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...