加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么DbSet Add返回一个实体实例而不是void?

发布时间:2020-12-15 17:44:44 所属栏目:百科 来源:网络整理
导读:DbSetTEntity.Add方法返回一个实体.我通常会期待一个Add操作有一个void返回类型. 当我看到EntityFramework source code时,我看到以下实现: public virtual TEntity Add(TEntity entity) { Check.NotNull(entity,"entity"); GetInternalSetWithCheck("Add").
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?

解决方法

TEntity是一个引用类型,所以添加到InternalSet< T>将是对实体的引用,而不是值.是否在实体添加到集合之前或之后更改实体的内容无关紧要,因为它从未在数据库中创建.一种或另一种方式,将执行INSERT或等效项.

至于为什么Add返回TEntity,它期望是因为它允许的事情像:

_dbSet.Add(new MyEntity()).SomeDatModifyingMethod();
_dbContext.SaveChanges();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读