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

前端之家收集整理的这篇文章主要介绍了c# – 为什么DbSet Add返回一个实体实例而不是void?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
DbSet<TEntity>.Add方法返回一个实体.我通常会期待一个Add操作有一个void返回类型.

当我看到EntityFramework source code时,我看到以下实现:@H_403_3@

public virtual TEntity Add(TEntity entity)
    {
        Check.NotNull(entity,"entity");

        GetInternalSetWithCheck("Add").Add(entity);
        return entity;
    }

GetInternalSetWithCheck返回一个InternalSet< TEntity>@H_403_3@

InternalSet的添加方法< TEntity>有趣的是它的签名中有一个void return类型:@H_403_3@

public virtual void Add(object entity)

我关心的是,当我对实体进行修改时,我是否需要小心,与何时将其添加到DbSet中.@H_403_3@

例如.有些情况在哪里@H_403_3@

var entity = new MyEntity();
_dbSet.Add(entity);
entity.SomeDatModifyingMethod();
_dbContext.SaveChanges();

可能给出不同的行为@H_403_3@

var entity = new MyEntity();
entity.SomeDatModifyingMethod();
_dbSet.Add(entity);
_dbContext.SaveChanges();

或不同的行为:@H_403_3@

var entity = new MyEntity();
entity = _dbSet.Add(entity);
entity.SomeDatModifyingMethod();
_dbContext.SaveChanges();

在基本的默认实现中,这并不重要,因为它总是返回完全相同的实例.但是,Add方法是虚拟的,所以它可以被覆盖(尽管在公共源代码中,唯一的覆盖是一个测试双重的 – 但我不知道源代码实际上包括了例如sqlServer支持实现).@H_403_3@

为什么DbSet Add返回实体实例而不是void?@H_403_3@

解决方法

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

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

_dbSet.Add(new MyEntity()).SomeDatModifyingMethod();
_dbContext.SaveChanges();
原文链接:/csharp/96811.html

猜你在找的C#相关文章