Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DbSet在实体框架中创建新对象<;T>;。创建()_C#_Entity Framework - Fatal编程技术网

C# 使用DbSet在实体框架中创建新对象<;T>;。创建()

C# 使用DbSet在实体框架中创建新对象<;T>;。创建(),c#,entity-framework,C#,Entity Framework,我正在用POCO将一个项目从Linq迁移到SQL,再迁移到实体框架,我不确定现在应该如何在EF中创建新对象 从表面上看,创建动态代理的DbSet.Create()似乎是更好的方法,因为它可以帮助我自动进行双向绑定(如果我正确构建POCO的话),但从我在浏览开源项目时看到的情况来看,大多数只使用标准的ctornew T() 在使用DbSet.Create()时,我能想到的唯一缺点是它使我的代码在某种程度上与EF耦合 还有什么我遗漏的吗 哪种方法可以帮助我更轻松地创建一个可测试、健壮的软件?您可能需

我正在用POCO将一个项目从Linq迁移到SQL,再迁移到实体框架,我不确定现在应该如何在EF中创建新对象

从表面上看,创建动态代理的DbSet.Create()似乎是更好的方法,因为它可以帮助我自动进行双向绑定(如果我正确构建POCO的话),但从我在浏览开源项目时看到的情况来看,大多数只使用标准的ctor
new T()

在使用
DbSet.Create()
时,我能想到的唯一缺点是它使我的代码在某种程度上与EF耦合

还有什么我遗漏的吗


哪种方法可以帮助我更轻松地创建一个可测试、健壮的软件?

您可能需要考虑将EF代码从其余的非EF代码中抽象出来,以便根据需要替换它以进行测试

其中一种方法(我也是这么做的)是使用通用存储库:

public interface IGenericRepository<TContext, TEntity>
    where TEntity : class, IEntity
    where TContext : IDbContext
{
    TEntity NewEntity();

}

public class GenericRepository<TContext, TEntity> : IGenericRepository<TContext, TEntity> 
    where TEntity : class, IEntity 
    where TContext : IDbContext
{
    private readonly IDbContext _context;

    public GenericRepository(IUnitOfWork<TContext> uow)
    {
        _context = uow.Context;
    }

    public TEntity NewEntity()
    {
        var t = _context.Set<TEntity>().Create();
        _context.Set<TEntity>().Add(t);
        return t;
    }
}
公共接口IGenericRepository
其中tenty:类,tenty
其中TContext:IDbContext
{
tenty NewEntity();
}
公共类GenericRepository:IGenericRepository
其中tenty:类,tenty
其中TContext:IDbContext
{
私有只读IDbContext _context;
公共总报告(IUnitOfWork uow)
{
_context=uow.context;
}
公共实体
{
var t=_context.Set().Create();
_context.Set().Add(t);
返回t;
}
}
请注意,我只包含了直接涵盖您的问题的代码-从
DBSet
创建一个新实体,但也隐藏了底层方法,以便您可以轻松地以非EF方式重新实现它


你可能会得到一些关于通用存储库的使用、它们是如何糟糕等的回复或评论——这些都是观点而不是事实,调查各种支持和反对的论点,得出自己的结论,而不是被其他人打得目瞪口呆。我使用它们来隐藏底层的持久层(EF、ADO.Net等),如果需要的话,可以很容易地将测试实现推到链的更高层。

标准的ctor new T()是一个不错的选择。@Oscar给出一个理由会很好:)这种可能的复制确实解决了耦合问题,但从我在使用此存储库模式的大型开源项目上看到的情况来看,他们仍然在使用默认的ctor创建新对象。你对实际的创建有什么见解吗?我假设你想做一些类似于
\u context.Set()的事情。创建(“value1”、“value2”、“value3”)
,方法与对象初始化器相同?那么恐怕EF目前不支持这个功能。你可以通过反思等方式做很多事情,但我怀疑这是否值得。