可跟踪实体主键违反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
我已经做了以下故障排除:
- 从我的本地机器调试问题,并指向生产数据库,它运行良好。所以这让我相信,也许代码不一样。
- 我将UAT环境中的代码复制到了Production web服务器上。但我还是犯了同样的错误。这让我相信数据库模式或其他设置可能不一样
- 比较了UAT和Prod之间的数据库模式。它们是相同的
关于如何进一步解决此问题的任何想法。我已经试了几天了。
提前感谢您的任何建议。
我猜您是手动管理主键,而不是数据库。
如果是这种情况,您可能会为具有相同id的同一个表获得两个并发插入,从而违反主键约束。