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

本文关键字:EF 问题 跟踪 实体 | 更新日期: 2024-10-20 15:08:13

我的情况非常糟糕。我们有一个.NET 4.5应用程序,它使用EF 4跟踪实体。在我们的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;
    }

堆栈跟踪为:

异常=更新条目时出错。查看内部详细信息除外。方法=更新源=System.Data.EntityStackTrace=在System.Data.MMapping.Update.Interal.UpdateTranslator.Update(IEntityStateManagerstateManager,IEntityAdapter适配器)System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)
在DataMarketplace。DataAccess。存储库。存储库帮助程序。EntitySave[TEntity](TEntity实体,布尔启用跟踪)InnerException=System.Data.SqlClient.SqlException(0x80131904):违反PRIMARY KEY约束"PK_DataFeedQueries"。不能在对象"dbo.DataFeedQueryState"中插入重复的键。重复键值为(3383)。语句已终止。在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,操作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超时,任务&任务布尔异步写入)System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehaviorcmdBehavior,RunBehavior运行行为,布尔返回流,字符串方法)System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior行为,字符串方法)System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行为)System.Data.MMapping.Update.Interal.DynamicUpdateCommand.Execute(UpdateTranslator转换器,EntityConnection连接,字典2 identifierValues, List 1 generatedValues)System.Data.MMapping.Update.Interal.UpdateTranslator.Update(IEntityStateManagerstateManager、IEntityAdapter适配器)客户端连接ID:9abb68fe-3424-45d8-a174-88ed692ac5fd自定义Message Text=RepositoryHelpers中的错误;方法:EntitySave Machine名称=WEB02-PROD

我已经做了以下故障排除:

  1. 从我的本地机器调试问题,并指向生产数据库,它运行良好。所以这让我相信,也许代码不一样。
    1. 我将UAT环境中的代码复制到了Production web服务器上。但我还是犯了同样的错误。这让我相信数据库模式或其他设置可能不一样
    2. 比较了UAT和Prod之间的数据库模式。它们是相同的

关于如何进一步解决此问题的任何想法。我已经试了几天了。

提前感谢您的任何建议。

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

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

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