Как использовать строковые ключи в (свободно) NHibernate - PullRequest
5 голосов
/ 14 марта 2012

Я работаю с базой данных brownfield, которая использует строки в качестве первичных ключей.Использование Fluent NHibernate с Sqlite (провайдер в памяти для модульного тестирования) и SQL Server 2005 .

У меня есть следующая сущность:

public class Entity
{
    public virtual DateTime TimeStamp { get; set; }

    public virtual string Name { get; set; }
}

С этим отображением:

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Map(_ => _.TimeStamp);
        Id(_ => _.Name).CustomType("AnsiString");
    }
}

Однако это не работает, говоря NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

Как это работает?Кроме того, есть ли хорошая документация о свободном доступном nhibernate?

Заранее спасибо.

1 Ответ

12 голосов
/ 14 марта 2012

Если вы используете строки в качестве своих первичных ключей, вам, вероятно, придется сделать что-то вроде этого:

public class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        Id(x => x.Name).GeneratedBy.Assigned();
        Map(x => x.TimeStamp);
    }
}

Из документации nhibernate:

5.1.4.7.Назначенные идентификаторы

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

Из-за своей внутренней сущности сущности, использующие этот генератор, не могут быть сохранены с помощью метода SaveOrUpdate () ISession.Вместо этого вы должны явно указать NHibernate, должен ли объект быть сохранен или обновлен, вызывая либо метод Save (), либо Update () в ISession.

Также здесь приведена соответствующая статья.Это немного устарело, но все еще относится к вашей ситуации:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8

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