可跟踪实体主键违规EF 4问题

时间:2015-03-06 20:59:59

标签: c# entity-framework entity-framework-4.1

我的情况非常糟糕。我们有一个使用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,Action 1 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

我已完成以下操作进行问题排查:

  1. 从本地计算机调试问题并指向生产数据库,它工作正常。所以它让我相信可能代码不一样。
    1. 我从我们的UAT环境中复制了代码,这些代码适用于生产Web服务器。但我仍然得到同样的错误。这让我相信数据库架构或其他一些设置可能不一样。
    2. 比较UAT和Prod之间的数据库模式。它们完全相同。
  2. 有关如何进一步解决此问题的任何想法。已经尝试了几天了。

    提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

我猜你是手动管理主键而不是数据库。

如果是这种情况,您可能会为具有相同ID的同一个表获得两个并发插入,违反了主键约束。