我的情况非常糟糕。我们有一个使用EF 4跟踪实体的.NET 4.5应用程序。在DEV / QA / UAT环境中,一切正常。但EF在生产中因主键违规而失败。我们有一个表和一个具有父表的外键,并且该外键也是子表中的主键。
执行更新的代码获取也具有其中引用的实体的实体。我们开始跟踪业务层和业务层,然后进行一些更新,然后传递到数据访问层进行实际更新。数据访问层中的代码如下:
internal static TEntity EntitySave<TEntity>(this TEntity entity, bool
enableTracking = true) where TEntity : class, IObjectWithChangeTracker
{
if (entity == null)
return entity;
MasterEntities context = null;
try
{
context = new MasterEntities();
if (!entity.ChangeTracker.ChangeTrackingEnabled) // This code isn't really doing anything since turning on tracking at this point doesn't matter
{ // ""
entity.StartTracking(); // ""
} // ""
context.EntityRoot<TEntity>().ApplyChanges(entity);
context.SaveChanges();
if (enableTracking)
context.ResetAllTracking();
}
catch (Exception ex)
{
new GroupM.ToolLib.AppException.Ex(false, ex, "Error in RepositoryHelpers; Method: EntitySave",
GroupM.ToolLib.AppException.ExType.Error,
GroupM.ToolLib.AppException.ExDestination.AppDefaultLogFile);
}
finally
{
if (context != null)
context.Dispose();
}
return entity;
}
堆栈跟踪是:
异常=更新条目时发生错误。看到内心 细节例外。 Method = Update Source = System.Data.Entity StackTrace = at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter适配器)at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)
在 DataMarketplace.DataAccess.Repositories.RepositoryHelpers.EntitySave [TEntity](TEntity entity,Boolean enableTracking) InnerException = System.Data.SqlClient.SqlException(0x80131904): 违反PRIMARY KEY约束&#39; PK_DataFeedQueries&#39;。不能 在对象&#39; dbo.DataFeedQueryState&#39;中插入重复键。重复 键值是(3383)。该语句已终止。在 System.Data.SqlClient.SqlConnection.OnError(SqlException异常, Boolean breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource
1完成,Int32超时,Task&amp;任务, 布尔asyncWrite)at System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String 方法)at System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior 行为,String方法)at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior 行为) System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator 翻译器,EntityConnection连接,字典2 identifierValues, List
1 generatedValues)at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter适配器) ClientConnectionId:9abb68fe-3424-45d8-a174-88ed692ac5fd自定义 消息文本= RepositoryHelpers中的错误;方法:EntitySave机器 名称= WEB02-PROD
我已完成以下操作进行问题排查:
有关如何进一步解决此问题的任何想法。已经尝试了几天了。
提前感谢任何建议。
答案 0 :(得分:0)
我猜你是手动管理主键而不是数据库。
如果是这种情况,您可能会为具有相同ID的同一个表获得两个并发插入,违反了主键约束。