DbSet<TEntity>.Add方法返回一个实体.我通常会期待一个Add操作有一个void返回类型.
当我看到EntityFramework source code时,我看到以下实现:
- public virtual TEntity Add(TEntity entity)
- {
- Check.NotNull(entity,"entity");
- GetInternalSetWithCheck("Add").Add(entity);
- return entity;
- }
GetInternalSetWithCheck返回一个InternalSet< TEntity>
InternalSet的添加方法< TEntity>有趣的是它的签名中有一个void return类型:
- 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方法是虚拟的,所以它可以被覆盖(尽管在公共源代码中,唯一的覆盖是一个测试双重的 – 但我不知道源代码实际上包括了例如sqlServer支持实现).
为什么DbSet Add返回实体实例而不是void?