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