Использование сопоставления NHibernate по коду: невозможно вставить явное значение для столбца идентификаторов в таблице 'DietUser', если для параметра IDENTITY_INSERT установлено значение OFF - PullRequest
5 голосов
/ 02 сентября 2011

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


При использовании нового сопоставления NHibernate по коду с SQL Server я не могу сохранить сущность.При сохранении сущности возникает System.Data.SqlClient.SqlException со следующим сообщением (без имени таблицы):

"Невозможно вставить явное значение для столбца идентификаторов в таблице 'DietUser', когда IDENTITY_INSERT имеет значениеустановлено на OFF. "

В моей таблице используется идентификационный идентификатор, а сущность и сопоставления выглядят так:

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual short DailyPoints { get; set; }
}

public class UserMapping : ClassMapping<User>
{
    public UserMapping()
    {
        Id(x => x.Id);
        Property(x => x.Name);
        Property(x => x.Username);
        Property(x => x.Password);
        Property(x => x.DailyPoints);
    }
}

Я знаю, как я сопоставлю это с использованием сопоставления XML, ноЯ хочу использовать встроенное отображение по коду, если это вообще возможно.

Ответы [ 3 ]

10 голосов
/ 02 сентября 2011

После того, как я покопался в форумах, мне повезло, и я нашел способ сопоставить это. Пример , который предоставляет Fabio , отлично подходит, если вы собираетесь использовать GUID для идентификатора или чего-то в этом роде, но если вы хотите использовать идентификатор (также видел множество других), вам нужно укажите, какой генератор вы собираетесь использовать. Вот мое обновленное отображение, которое работает:

public class UserMapping : ClassMapping<User>
{
    public UserMapping()
    {
        Id(x => x.Id, map => map.Generator(Generators.Identity));
        Property(x => x.Name);
        Property(x => x.Username);
        Property(x => x.Password);
        Property(x => x.DailyPoints);
    }
}
1 голос
/ 06 апреля 2012

Говоря об идентификаторах, если вы установите generator=identity, NHibernate не сможет выполнить пакетную вставку, потому что ему нужен дополнительный запрос для получения этого кровавого идентификатора, сгенерированного базой данных.

0 голосов
/ 02 сентября 2011

Вы пытаетесь присвоить значение свойству Id перед сохранением сущности?Можете ли вы добавить кусочек кода, который пытается сохранить изменения в базе данных?

Пока я начинал изучать NHibernate, я создал небольшую демонстрацию для примера начала работы.Вот. Надеюсь это помогает.

...