【发布时间】:2011-08-11 06:05:44
【问题描述】:
我是 Entity Framework 的新手,所以请不要犹豫指出任何错误。无论如何,我会尝试按照我的理解描述我的问题。
我正在使用实体框架创建一个 n 层应用程序。我还在使用this page 中描述的通用存储库。
我成功地填充了DetailsView 并通过ObjectDataSource 向数据库插入了一个值。但是,我在更新时遇到了问题。
我得到的错误是
具有与所提供对象的键匹配的键的对象可以 在 ObjectStateManager 中找不到。验证的关键值 提供的对象与对象的键值匹配 必须应用更改。
我也理解为什么会这样。我使用以下方法填充数据库中的值。
public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
{
return GetQuery<TEntity>().AsEnumerable();
}
public List<Company> GetAllCompanies()
{
return _genericRepository.GetAll<Company>().ToList();
}
如果我在GetAll 方法中放置一个断点并观察结果,我会发现EntityKey 已设置并且IsChangeTracked 对于列表中的每个对象都是正确的。
但如果我检查传递给UpdateMethod 为ObjectDataSource 指定的对象,则EntityKey 为空,EntityState 已分离,IsChangeTracked 为假。所以因为 EntityKey 为空,所以我理解异常是有效的。
我的更新方法是这样的
public void Update<TEntity>(TEntity entity) where TEntity : class
{
ObjectSet<TEntity> objSet = DataContext.CreateObjectSet<TEntity>();
objSet.ApplyCurrentValues(entity);
SaveChanges();
}
我尝试使用objSet.Attach(entity); 附加,然后没有例外,但对象也没有得到更新。
如何使用 DetailsView 正确执行更新?或者我如何正确地将ObjectDataSource 绑定到DetailsView?如何确保我的 EntityKey 不会变为 null ?
【问题讨论】:
-
您是否尝试将状态更改为已修改。
DataContext.ObjectStateManager.ChangeObjectState(Object entity, EntityStat.Modified)?
标签: entity-framework repository-pattern objectdatasource detailsview n-tier-architecture