使用DbSet <t> .Create()</t>在Entity Framework中创建新对象

时间:2014-06-12 08:48:47

标签: c# entity-framework

我正在使用POCO将项目从Linq-to-SQL迁移到Entity Framework,我不知道如何在EF中创建新对象。

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

使用DbSet<T>.Create()时唯一能想到的是它使我的代码与EF有些耦合。

还有什么我遗失的吗?

哪种方式可以帮助我更轻松地创建可测试的强大软件?

1 个答案:

答案 0 :(得分:1)

您可能需要考虑将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;
    }
}

请注意,我只包含了直接涵盖您问题的代码 - 从DBSet创建新实体,但也隐藏了基础方法,以便您可以轻松地以非EF方式重新实现它。

您可能会收到一些关于使用通用存储库的回复或评论,它们是如何不好等等 - 它的所有意见而不是事实,调查支持和反对的各种论据并得出您自己的结论而不是被棕色打败其他人。我使用它们隐藏底层持久层(EF,ADO.Net等),如果需要的话,可以很容易地将测试实现推送到链中的代码。