1

我是实体框架的绝对新手,所以请不要犹豫,指出任何错误。无论如何,我会尽我所能描述我的问题。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不会变为空?

+0

所示的方法的问题,您是否试图改变状态修改。 'DataContext.ObjectStateManager.ChangeObjectState(Object entity,EntityStat.Modified)'? – Eranga

回答

1

解决使用下面

public void Update<TEntity>(TEntity entity) where TEntity : class 
{ 
    object originalItem; 

    EntityKey key = DataContext.CreateEntityKey(GetEntityName<TEntity>(), entity); 

    if (DataContext.TryGetObjectByKey(key, out originalItem)) 
    { 
     DataContext.ApplyCurrentValues(key.EntitySetName, entity);     
    } 

    SaveChanges(); 
} 
相关问题