Почему в LINQ to SQL появляется сообщение «Невозможно вставить явное значение для столбца идентификаторов», если не указано значение для столбца идентификаторов? - PullRequest
5 голосов
/ 05 августа 2009

У меня есть таблица, которая выглядит так: alt text

ClientID - единственный столбец идентификаторов в моей таблице. UserID - это FK для первичного ключа другой таблицы.

Вот мой код вставки Linq to SQL:

public void InsertClientByUsername(string username, Entities.Client clientInfo)
{

    using (LinqModelDataContext db = new LinqModelDataContext())
    {

        var existingClient = (from client in db.Clients
                              join ext_usr in db.User_Extendeds on client.UserID equals ext_usr.FriendlyUserID
                              join asp_usr in db.aspnet_Users on ext_usr.UserID equals asp_usr.UserId
                              where asp_usr.UserName.ToLower().Equals(username)
                              select client).SingleOrDefault();

        if (existingClient != null)
        {
            existingClient.Address1 = clientInfo.Address1;
            existingClient.Address2 = clientInfo.Address2;
            existingClient.City = clientInfo.City;
            existingClient.CompanyName = clientInfo.CompanyName;
            existingClient.CountryID = clientInfo.CountryID;
            existingClient.FaxNumber = clientInfo.Fax;
            existingClient.FirstName = clientInfo.FirstName;
            existingClient.LastName = clientInfo.LastName;
            existingClient.MailingAttention = clientInfo.Attention;
            existingClient.PhoneNumber = clientInfo.PhoneNumber;
            existingClient.StateID = clientInfo.StateID;
            existingClient.ZipCode = clientInfo.Zip;

        }
        else
        {
            int userID = (from ext_usr in db.User_Extendeds
                          join asp_usr in db.aspnet_Users on ext_usr.UserID equals asp_usr.UserId
                          where asp_usr.UserName.ToLower().Equals(username)
                          select ext_usr.FriendlyUserID).SingleOrDefault();

            Client newClient = new Client();
            newClient.UserID = userID;
            newClient.Address1 = clientInfo.Address1;
            newClient.Address2 = clientInfo.Address2;
            newClient.City = clientInfo.City;
            newClient.CompanyName = clientInfo.CompanyName;
            newClient.CountryID = clientInfo.CountryID;
            newClient.FaxNumber = clientInfo.Fax;
            newClient.FirstName = clientInfo.FirstName;
            newClient.LastName = clientInfo.LastName;
            newClient.MailingAttention = clientInfo.Attention;
            newClient.PhoneNumber = clientInfo.PhoneNumber;
            newClient.StateID = clientInfo.StateID;
            newClient.ZipCode = clientInfo.Zip;

            db.Clients.InsertOnSubmit(newClient);

        }

        db.SubmitChanges();
    }
}

Если вам интересно, у меня есть все эти назначения, потому что я транслирую между моими объектами домена POCO и сгенерированными объектами linq. В случае этого исключения он использует путь оператора else, создавая нового клиента.

Вы можете видеть, что я НЕ касаюсь свойства ClientID, которое является единственным столбцом идентификатора в таблице.

Почему я получаю сообщение "Невозможно вставить явное значение для столбца идентификаторов в таблице" Клиент ", когда для параметра IDENTITY_INSERT установлено значение OFF?

Если это полезно, вот моя трассировка стека:

System.Data.SqlClient.SqlException был не обрабатывается кодом пользователя
Сообщение = "Невозможно вставить явное значение для столбца идентификаторов в таблице «Клиент» когда для IDENTITY_INSERT установлено значение OFF. "
Source = ". Net SqlClient Data Provider" ErrorCode = -2146232060 Класс = 16
LineNumber = 1 номер = 544
Процедура = ""
Состояние сервера = "192.168.168.190" = 1
Трассировки стека: в System.Data.SqlClient.SqlConnection.OnError (SqlException исключение, Boolean breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (SqlException исключение, Boolean breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior, runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, метод String, Результат DbAsyncResult) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult результат, String methodName, Boolean sendToPipe) в System.Data.SqlClient.SqlCommand.ExecuteNonQuery () в System.Data.Linq.SqlClient.SqlProvider.Execute (выражение запрос, QueryInfo queryInfo, IObjectReaderFactory factory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (выражение запрос, QueryInfo [] queryInfos, IObjectReaderFactory factory, Object [] userArguments, ICompiledSubQuery [] подзапросы) в System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (выражение запрос) в System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert (TrackedObject вещь) в System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert (TrackedObject вещь) в System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode) в System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode) в System.Data.Linq.DataContext.SubmitChanges () в DomainModel.Repository.Concrete.SqlClientRepository.InsertClientByUsername (String имя пользователя, клиент clientInfo)

Ответы [ 7 ]

4 голосов
/ 07 августа 2009

add StoreGeneratedPattern = "Identity" в файле .edmx (просмотр в текстовом редакторе)

1 голос
/ 05 июня 2012

Я удалил таблицу из * .dbml в visual studio и вставил ее снова. вышеуказанная проблема решена!

1 голос
/ 17 октября 2010

У меня была такая же проблема, но стирание сущности и ее импорт назад не помогли мне, из-за чего пришлось копать еще глубже. Настоящая проблема здесь заключается в том, что в содержимом SSDL вашей диаграммы сущностей отсутствует отсутствующий атрибут (StoreGeneratedPattern = "Identity"), который должен находиться в свойстве ID вашей сущности. Как только вы добавите этот атрибут, у вас все будет готово.

Пример:

<EntityType Name="TABLENAME">
  <Key>
    <PropertyRef Name="ID" />
  </Key>
  <Property Name="ID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
</EntityType>
1 голос
/ 25 июня 2010

У меня тоже была такая же проблема: удаление таблицы и ее чтение исправили. Я не знаю, что решение не было красивым, оно, безусловно, помогло и было очень быстрым. Это уродливо в том, что это ошибка в Linq-to-Sql и Visual Studio 2008 (в моем случае это может быть ошибка и в других версиях), но это, по крайней мере, приемлемая ошибка.

1 голос
/ 05 августа 2009

С здесь

Попробуйте установить для параметра «Auto Generated Value» значение false

0 голосов
/ 25 июня 2010

Как говорит @Martin, у меня была такая же проблема, хотя мне не нужно было удалять всю диаграмму, чтобы ее исправить. Все, что мне нужно было сделать, это заставить диаграмму восстановить код. Обычно это просто вопрос изменения чего-либо на диаграмме и его изменения обратно. В более серьезных случаях мне приходилось перезагружать VS или даже перезагружать компьютер, чтобы дизайнер перегенерировал код.

0 голосов
/ 05 августа 2009

Попробуйте установить Read Only в true.

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