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 是否正确完成。它为您的业务增加了另一层安全性。
到处找教程之类的。
我一直在尝试将 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 是否正确完成。它为您的业务增加了另一层安全性。