需求:复制数据库中的一条数据。
问题:通过EF查询出这条数据时,想更改这个对象的主键后,在新增这条数据,会提示:System.InvalidOperationException: The property 'Id' is part of the object's key information and cannot be modified. 在 System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInProperty(Int32 ordinal, Boolean detectOnlyComplexProperties, Boolean detectOnly) 在 System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties) 在 System.Data.Entity.Core.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries) 在 System.Data.Entity.Core.Objects.ObjectStateManager.DetectChanges() 在 System.Data.Entity.Core.Objects.ObjectContext.DetectChanges() 在 System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force) 在 System.Data.Entity.Internal.InternalContext.GetStateEntries(Func`2 predicate) 在 System.Data.Entity.Internal.InternalContext.GetStateEntries() 在 System.Data.Entity.Infrastructure.DbChangeTracker.Entries() 在 Abp.EntityFramework.AbpDbContext.ApplyAbpConcepts() 在 Abp.EntityFramework.AbpDbContext.SaveChanges() 在 Abp.EntityFramework.Uow.EfUnitOfWork.SaveChangesInDbContext(DbContext dbContext) 在 Abp.EntityFramework.Uow.EfUnitOfWork.SaveChanges() 在 Abp.EntityFramework.Uow.EfUnitOfWork.CompleteUow() 在 Abp.Domain.Uow.UnitOfWorkBase.Complete() 在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformSyncUow(IInvocation invocation, UnitOfWorkOptions options) 在 Abp.Domain.Uow.UnitOfWorkInterceptor.PerformUow(IInvocation invocation, UnitOfWorkOptions options) 在 Abp.Domain.Uow.UnitOfWorkInterceptor.Intercept(IInvocation invocation) 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Abp.Auditing.AuditingInterceptor.Intercept(IInvocation invocation) 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Abp.Runtime.Validation.Interception.ValidationInterceptor.Intercept(IInvocation invocation) 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Castle.Proxies.ExamAppServiceProxy.CopyExam(ExamCloneInput input)--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Abp.WebApi.Controllers.Dynamic.Interceptors.AbpDynamicApiControllerInterceptor`1.Intercept(IInvocation invocation) 在 Castle.DynamicProxy.AbstractInvocation.Proceed() 在 Castle.Proxies.DynamicApiController`1Proxy.CopyExam(ExamCloneInput input) 在 lambda_method(Closure , Object , Object[] ) 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object instance, Object[] methodParameters) 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Abp.WebApi.Uow.AbpApiUowFilter.d__6.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Abp.WebApi.Validation.AbpApiValidationFilter.d__5.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Abp.WebApi.Auditing.AbpApiAuditFilter.d__4.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Abp.WebApi.Security.AntiForgery.AbpAntiForgeryApiFilter.d__10.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Abp.WebApi.Authorization.AbpApiAuthorizeFilter.d__7.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext()--- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext().
解决办法:EF底层查询时,不要数据库跟踪,.AsNoTracking()
如下这样查询:这是查询出的数据对象,就可以随意更改他的主键。
Context.Set().Where(func).AsNoTracking().ToList();