ASP.NET 5 MVC 6 通用存储库模式

ASP.NET 5 MVC 6 Generic Repository Pattern

到处找教程之类的。

我一直在尝试将 MVC5 的旧通用存储库模式实施到新的 MVC6 项目中。

我设置了 3 class 库的 .Core.Data.Service,但是 IDBset 有问题,看来我的智能感知没有喜欢它,我尝试添加 System.Data 和 Entity framework 6 但没有任何运气(找不到它......令人困惑)。

漫游后google我决定在这里问一下,是否有正确方法的教程,或者有人可以提出一个非常简单的 MVC6 通用存储库模式吗?我有一种感觉,旧的方法可能已经改变,除了内置的 DI 之外似乎找不到任何信息。

代码: 我的 IDbContext 界面

IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

没看到IDbSet,这仅仅是因为Entity Framework?我确实有它的参考资料。

问题可能是我找不到 entity framework 的使用声明。

更新:

使用 Entity framework 8.0.0 测试版。将所有 IDbset 引用更改为 DbSet。

但是在我的通用存储库中,我使用了以下方法:

public virtual T GetById(object id)
{
    return this.Entities.Find(id);
}

"Find" 不是一种方法。而且我不能再在我的捕获物中使用 "DbEntityValidationException"。

Entity Framework 7 Beta 8 没有附带查找方法。它可能会在最终版本之前添加。

在此之前,您将不得不使用 FirstOrDefault 方法

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

因为 Id 属性 不会被识别,所以您必须添加一个接口并让您的存储库实现它。

public interface IEntity
{
     int Id { get; set; }
}

例如

 public class GenericRepository<T> : IGenericRepository<T> where T: class, IEntity

来自github issues list。 EF7 不执行自动数据验证,因此 EF7 中不存在 DbEntityValidationException。

注意:EF7 不是 EF 的更新,而是重写。

在Entity Framework7中IDbSet本身代表了一个Repository模式的实现。

/// <summary>
///     A DbContext instance represents a session with the database and can be used to query and save
///     instances of your entities. DbContext is a combination of the Unit Of Work and Repository patterns.
/// </summary>

Source: GitHub EntityFramework7 repo, DbContext.cs 24-27 line

DBContext它是UnitOfWork

的实现

与 firste 的回答相反,我对使用 FirstOrDefault 没有信心,因为它会生成 SELECT TOP 1 [...]。

在许多情况下,Id 应该是唯一的,但有时您的 Db 可能设计得很糟糕。如果不是,您的应用程序应该抛出异常(这就是我们要处理的)。

因此,在 EF7 实现 Find() 方法之前,我强烈建议使用 SingleOrDefault() :

public virtual T GetById(int id)
{
    return this.Entities.SingleOrDefault(x => x.Id == id);
}

像这样,您添加一个应用程序控件来验证 Id 应该是唯一的,而不关心 Db 是否正确完成。它为您的业务增加了另一层安全性。