У меня есть таблица, которая выглядит так:
![alt text](https://imgur.com/MXqRf.png)
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)