首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用saveChanges时出错

调用saveChanges时出错
EN

Stack Overflow用户
提问于 2012-12-23 21:02:55
回答 1查看 17.6K关注 0票数 3

我在添加新记录时收到以下错误

代码语言:javascript
运行
复制
System.Data.Entity.Infrastructure.DbUpdateException was caught
HResult=-2146233087
Message=An error occurred while updating the entries. See the inner exception for details.
Source=EntityFramework
StackTrace:
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at Navigation.RepositoryBase`2.Add(T entity) in c:\Users\afahmy\Documents\Visual Studio 2012\Projects\Navigation\REpositoryBase.cs:line 174
InnerException: System.Data.UpdateException
   HResult=-2146233087
   Message=An error occurred while updating the entries. See the inner exception for details.
   Source=System.Data.Entity
   StackTrace:
        at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
        at System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)
        at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
        at System.Data.Entity.Internal.InternalContext.SaveChanges()
   InnerException: System.Data.SqlClient.SqlException
        HResult=-2146232060
        Message=Violation of PRIMARY KEY constraint 'PK_dbo.Priorities'. Cannot insert duplicate key in object 'dbo.Priorities'. The duplicate key value is (55c9b08f-1133-4246-9d0b-4f3e5192ffa5).

The statement has been terminated.
        Source=.Net SqlClient Data Provider
        ErrorCode=-2146232060
        Class=14
        LineNumber=1
        Number=2627
        Procedure=""
        Server=dbsrv
        State=1
        StackTrace:
             at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
             at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, 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.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)
             at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
             at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
             at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
             at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
             at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
        InnerException: 

代码如下

代码语言:javascript
运行
复制
public virtual OperationResult Add(T entity)
    {
        OperationResult opStatus = new OperationResult { Result = QueryResult.Succeeded };

        try
        {
            DataContext.Set<T>().Add(entity);
            opStatus.Result = (DataContext.SaveChanges() > 0) ? QueryResult.Succeeded : QueryResult.Failed;
        }
        catch (Exception exp)
        {
            opStatus.ExceptionMessage = string.Format(" Error Adding {0}", exp.Message);
            opStatus.Result = QueryResult.Failed;
        }

        return opStatus;
    }
EN

回答 1

Stack Overflow用户

发布于 2012-12-23 23:17:44

显然,以前已经从数据库中获取过entity对象。如果你将它添加到上下文中,它将得到EntityState.Added,这意味着EF将尝试插入它。显然,您在客户端生成了一个主键值(即,不在数据库中),因此EF尝试将其与现有的PK值一起插入。

由于这是DbContext应用程序接口(从Set方法看起来很明显,但对显式标记总是有帮助的),因此可以使用IDbSetExtensions.AddOrUpdate方法让EF确定是否需要插入或更新对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14011166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档