DbSet<TEntity>.Add 方法返回一个实体。通常我会期望像 Add
这样的操作返回类型为 void
。
当我查看EntityFramework源代码时,我看到以下实现:
public virtual TEntity Add(TEntity entity)
{
Check.NotNull(entity, "entity");
GetInternalSetWithCheck("Add").Add(entity);
return entity;
}
GetInternalSetWithCheck
返回一个 InternalSet<TEntity>
有趣的是,InternalSet<TEntity>
的 Add
方法在其签名中具有 void 返回类型:
public virtual void Add(object entity)
我的担忧是,当我修改与DbSet相关联的实体时,是否需要注意何时进行修改。
例如,是否存在这样的情况
var entity = new MyEntity();
_dbSet.Add(entity);
entity.SomeDatModifyingMethod();
_dbContext.SaveChanges();
可能会导致不同的行为,而不是
var entity = new MyEntity();
entity.SomeDatModifyingMethod();
_dbSet.Add(entity);
_dbContext.SaveChanges();
或者不同的行为:
var entity = new MyEntity();
entity = _dbSet.Add(entity);
entity.SomeDatModifyingMethod();
_dbContext.SaveChanges();
在基本默认实现中,这并不重要,因为它只返回完全相同的实例。但是,Add
方法是 virtual
的,因此它可以被覆盖(尽管在公共源代码中,唯一的覆盖是一个测试双倍体 - 但我不确定该源代码是否实际包括例如 SqlServer 支持实现)。
为什么 DbSet Add 返回实体实例而不是 void?
Add
方法永远不会像返回代理那样做某些事情 - 也许是为了更改跟踪? - 在这种情况下,在添加后重新分配引用可能很重要?(例如,最后一个代码示例) - Nathan