仅使用DbSet更新对象

时间:2015-09-26 09:16:00

标签: entity-framework dbcontext dbset

我尝试应用this blog中描述的工作单元模式,但遇到了以下问题:如果我将关联的DbSet仅注入到repo中,例如

public ArticleRepository(DbSet<Article> articles)
{
   this.articles = articles;
}

那么如何更新记录或将其状态设置为修改?

在我使用之前

public void Update(Article article)
{
   this.context.Entry(article).State = EntityState.Modified;
}

但是使用新方法我再也无法访问DbContext了。 DbSet.Add和DbSet.Attach都不会在这里工作,那么如何在上下文中更新对象呢?

1 个答案:

答案 0 :(得分:3)

System.Data.Entity.Migrations.IDbSetExtensions包含IDbSet扩展名AddOrUpdate <TEntity&gt;。这将更新实体。

有些人喜欢不知道他们是在添加新实体还是更改现有实体的优势。

但是,如果您在更新尚未添加的项目时确实需要更新错误,请查看Source Code of IDbSetExtensions.AddOrUpdate

在这里你可以看到该函数首先检查项目是否存在,并根据结果添加或更新它,如下所示:

var existing = set.SingleOrDefault
    (Expression.Lambda<Func <TEntity, bool>> (matchExpression, new[]
        {parameter}));

if (existing != null)
{   // entity exists: update it
    foreach (var keyProperty in keyProperties)
    {
        keyProperty.Single().SetValue
            (entity, keyProperty.Single().GetValue (existing, null), null);
    }
    internalSet.InternalContext.Owner.Entry(existing)
        .CurrentValues.SetValues (entity);
}
else
{   // not existing entity: Add it
    internalSet.Add(entity);
}

如果您不想要AddOrUpdate,但实际上只需要更新,请考虑为IDbSet创建自己的Extension方法。见Extension Methods (C# Programming Guide)