我尝试应用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都不会在这里工作,那么如何在上下文中更新对象呢?
答案 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)