嗨,我正在为我的 ASP.NET MVC 网站使用 EntityFramework,但在更新时遇到了一些问题。这是我的更新代码的样子:using (BissEntities context = new BissEntities()) { if (adCategoryFilter.Id < 1) context.AddToAdCategoryFilter(adCategoryFilter); else context.Refresh(System.Data.Objects.RefreshMode.ClientWins, adCategoryFilter); if (context.SaveChanges() > 0) return true; } return false;执行 context.Refresh 时,我收到以下异常: 要刷新的对象集合中索引 0 处的元素具有 null EntityKey 属性值或未附加到此 ObjectStateManager。 Stacktrace : at System.Data.Objects.ObjectContext.RefreshCheck(Dictionary`2 entities, Object entity, EntityKey key) at System.Data.Objects.ObjectContext.AddRefreshKey(Object entityLike, Dictionary`2 entities, Dictionary`2 currentKeys) at System.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode, IEnumerable collection) at System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode, Object entity) at Biss.Models.FilterModel.UpdateCategoryFilter(AdCategoryFilter adCategoryFilter) in C:\Users\Snowman\Documents\Visual Studio 2010\Projects\Biss\Biss\Models\FilterModel.cs:line 86这不是我第一次遇到这个问题。首先,我认为这可能与数据库中的关系有关,但是在从受影响的表中删除这些关系后,仍然存在相同的异常。 adCategoryFilter 来自哪里? adCategoryFilter 被实例化(新),然后填充来自 ViewObject(来自网站)的数据。它确实具有所需的数据,例如过滤器 ID(将过滤器映射到 db 中的正确行)。请解释为什么我会遇到这个问题以及我如何解决它。 最好的问候 最佳答案 因为您使用 ASP.NET MVC,所以您在 无状态 环境中工作。这意味着,一旦请求完成处理,就不再有“ Entity Framework 内存”或“图形”。因此,您需要明确告诉 EF 您希望添加或更新。这是你如何做到的:using (BissEntities context = new BissEntities()){ if (adCategoryFilter.Id < 1) context.AdCategoryFilters.AddObject(adCategoryFilter); else { var stub = new AdCategoryFilters { Id = adCategoryFilter.Id }; context.AdCategoryFilters.Attach(stub); context.AdCategoryFilters.ApplyCurrentValues(adCategoryFilter); } context.SaveChanges();}这称为 stub 技术。 简而言之,您使用与您尝试更新的实体相同的实体键创建一个新实体(在您的情况下,实体键是“Id”)。然后您“附加”这个 stub (因此它被 EF 内部图跟踪),然后用您的实体覆盖这个 stub 上的值以更新,然后保存更改。我不能使用 UpdateModel ,因为我有一个多层架构并使用 POCO、自定义 View 模型等 - 所以我在我的服务/存储库上创建了一个自定义的“UpdateModel”方法 - 它有一个(更复杂的)版本上述的。也尽量不要在 ASP.NET MVC 中使用“if Id 更新 ,您上面的代码将尝试执行 添加 。而是更明确 - 为添加/更新提供单独的操作方法。哈。关于c# - 使用 Entity Framework 更新异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4430236/ 10-10 07:22