我是实体框架的绝对新手,所以请不要犹豫,指出任何错误。无论如何,我会尽我所能描述我的问题。N层应用程序中的实体框架和DetailsView
我正在用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
是列表中的每个对象的真实。
但是,如果我检查传递为ObjectDataSource
指定的UpdateMethod
对象,然后EntityKey
为null,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不会变为空?
所示的方法的问题,您是否试图改变状态修改。 'DataContext.ObjectStateManager.ChangeObjectState(Object entity,EntityStat.Modified)'? – Eranga