我是否在EF6中为部分DbContext类正确创建了界面?

时间:2015-10-16 18:17:17

标签: entity-framework asp.net-web-api

我正在使用ASP.NET WebAPI 2& EF6是一个非常小的项目,利用AutoFac将我的DbContext直接注入我的控制器。根据Ryan的回答,我使用存储库模式:NOT using repository pattern, use the ORM as is (EF)。为了执行注入,我继续创建了一个如下界面:

public interface IMoveGroupEntities : IDisposable
{
    System.Data.Entity.DbSet<HostEntry> HostEntries { get; set; }
    DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
    Task<int> SaveChangesAsync();
}

然后在部分类上实现了接口,该部分类与我生成的实体一起使用,如下所示:

public partial class MoveGroupEntities : IMoveGroupEntities
{
}

我有一种潜在的怀疑,我在这里做错了,因为我觉得这句话:

DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;

不应该需要,但它似乎是必要的,因为&#34;条目&#34;在我的脚手架API控制器中使用。

任何人都可以通过更好的方式来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

关于脚手架代码,你能说的最好的是:它有效。它在架构上不是最好的代码。我完全同意你引用的链接,但这并不意味着控制器应该直接与EF工件联系(包括Entry)。

我认为用另一个包装器替换一个DbSet包装器(存储库)是错误的。 answer的要点是:在代码中直接使用上下文(和DbSet等)。那就是:不要使用包装纸。那是:在任何地方使用上下文(等) 。你完全相反:你创建了一个不同类型的包装器,以便在任何地方使用EF。但是,你的直觉并不是真的很好。

我总是喜欢保持动作方法(MVC,Web API)小。基本上,我只是让他们调用一种服务方法。它是处理上下文和EF必须提供的所有内容的服务。这些服务可以在一个单独的程序集中,但无论它们在哪里,它们都通过依赖注入注入控制器,同样,它们通过DI获得它们的上下文。