【问题标题】:Entity Framework and DetailsView in N-Tier ApplicationN 层应用程序中的实体框架和详细信息视图
【发布时间】: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 对于列表中的每个对象都是正确的。

但如果我检查传递给UpdateMethodObjectDataSource 指定的对象,则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


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多