2012-12-23 44 views
3

我同時增加了新的記錄錯誤而調用的SaveChanges

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: 

代碼如下

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; 
    } 
+0

這裏是原因:違反PRIMARY KEY約束'PK_dbo.Priorities'。不能在對象'dbo.Priorities'中插入重複鍵。重複的鍵值是(55c9b08f-1133-4246-9d0b-4f3e5192ffa5) –

回答

1

顯然,entity對象已經從數據庫中獲取之前收到以下錯誤。如果將其添加到上下文中,它將得到EntityState.Added,這意味着EF將嘗試插入它。顯然你生成一個主鍵值客戶端(即不在數據庫中),所以EF試圖插入一個現有的PK值。

由於這是DbContext API(從Set方法中很明顯,但總是有助於明確標記),因此可以使用IDbSetExtensions.AddOrUpdate方法讓EF確定是否需要插入或更新對象。

+1

我在每個表格和[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]中添加了newid() public Guid Id {get;組; }它的工作 – user1924973

+0

現在沒有例外,但當我添加新行的實體中的任何導航屬性添加一個新的行,我需要將其添加爲外鍵請幫助 – user1924973

+0

我需要更多關於導航屬性的信息。你最好問一個包含重要信息的新問題,因爲這也是一個新問題。 –