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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |