Pourquoi suis-je “Ne peut pas insérer explicitement la valeur d'une colonne d'identité” dans LINQ to SQL quand je ne suis pas spécifier de valeur pour une colonne d'identité?

J'ai une table qui ressemble à ceci:
Pourquoi suis-je “Ne peut pas insérer explicitement la valeur d'une colonne d'identité” dans LINQ to SQL quand je ne suis pas spécifier de valeur pour une colonne d'identité?

ClientID est la seule identité de la colonne I du tableau. UserID est un FK à une les différentes tables de la clé primaire.

Voici mon Linq to SQL insert code:

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();
}
}

Dans le cas où vous êtes curieux, la raison pourquoi j'ai toutes ces missions est parce que je suis traduction entre ma POCO objets du domaine et le linq objets générés. Dans le cas de cette exception, c'est prendre le chemin de l'instruction else, la création d'un nouveau client.

Vous pouvez voir que je suis PAS de toucher à la propriété ClientID qui est le ~seulement~ l'identité de la colonne dans la table.

Pourquoi suis-je à la "Impossible d'insérer une valeur explicite pour l'identité de la colonne dans la table 'Client' lorsque IDENTITY_INSERT est réglé sur OFF?

Dans le cas où il est utile, voici mon stacktrace:

Système.Les données.SqlClient.SqlException a été
non gérée par le code de l'utilisateur
Message="Impossible d'insérer une valeur explicite
pour l'identité de la colonne dans la table 'Client'
lorsque IDENTITY_INSERT est réglé sur OFF."
Source=".Net Fournisseur De Données SqlClient"
ErrorCode=-2146232060 Class=16
LineNumber=1 Numéro=544
Procédure=""
Serveur="192.168.168.190" État=1
StackTrace:
au Système.Les données.SqlClient.SqlConnection.OnError(SqlException
exception, d'une valeur de type Boolean breakConnection)
au Système.Les données.SqlClient.SqlInternalConnection.OnError(SqlException
exception, d'une valeur de type Boolean breakConnection)
au Système.Les données.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj)
au Système.Les données.SqlClient.TdsParser.Exécuter(RunBehavior
runBehavior, SqlCommand cmdHandler,
SqlDataReader dataStream,
BulkCopySimpleResultSet
bulkCopyHandler, TdsParserStateObject
stateObj)
au Système.Les données.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader
ds, RunBehavior runBehavior, Chaîne
resetOptionsString)
au Système.Les données.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior,
Boolean returnStream, Boolean async)
au Système.Les données.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior,
Boolean returnStream, méthode de Chaîne,
DbAsyncResult suite)
au Système.Les données.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult
résultat, la Chaîne methodName, Boolean
sendToPipe)
au Système.Les données.SqlClient.SqlCommand.ExecuteNonQuery()
au Système.Les données.Linq.SqlClient.SqlProvider.Execute(Expression
requête, QueryInfo queryInfo,
IObjectReaderFactory usine, Object[]
parentArgs, Object[] userArgs,
ICompiledSubQuery[] sous-requêtes, Objet
lastResult)
au Système.Les données.Linq.SqlClient.SqlProvider.ExecuteAll(Expression
requête, QueryInfo[] queryInfos,
IObjectReaderFactory usine, Object[]
userArguments, ICompiledSubQuery[]
les sous-requêtes)
au Système.Les données.Linq.SqlClient.SqlProvider.Système.Les données.Linq.Fournisseur de.IProvider.Execute(Expression
requête)
au Système.Les données.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject
l'élément)
au Système.Les données.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject
l'élément)
au Système.Les données.Linq.ChangeProcessor.SubmitChanges(ConflictMode
failureMode)
au Système.Les données.Linq.DataContext.SubmitChanges(ConflictMode
failureMode)
au Système.Les données.Linq.DataContext.SubmitChanges()
au DomainModel.Référentiel.Le béton.SqlClientRepository.InsertClientByUsername(String
nom d'utilisateur, le Client clientInfo)

Vous pouvez utiliser le générateur de profils SQL à regarder le SQL généré. Mais il n'y a pas beaucoup de doute que le L2S est de générer une valeur. Jetez un oeil dans le genned code (Projet|Afficher Tous les fichiers) pour voir si les métadonnées pour le ClientId colonne a vraiment l '"marqueur identitaire" (c'musnt, ou il doit y avoir une version de fichier à confusion ...)
Bartelink, pour une raison quelconque, il était un drôle de bug dans mon code généré. J'ai supprimé mon contexte de données et reconstruite, et cette fois ça a fonctionné. Étrange.
J'ai eu le même problème... SqlDesigner question, je suppose.

OriginalL'auteur FalconKick | 2009-08-05