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

时间:2015-11-11 09:50:54

标签: c# asp.net-core asp.net-core-mvc entity-framework-core

一直在寻找教程或其他什么地方。

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

我设置了3个类库.Core.Data.Service,但IDBset存在问题,似乎我的intellisense没有& #39; t喜欢它,我试图添加System.Data和实体框架6但没有任何运气(无法找到它......令人困惑)。

漫游google之后我决定在这里问一下,有没有正确的教程,或者有人会抛出一个非常简单的MVC6 Generic Repository模式?我有一种感觉,Old的做法可能已经改变,似乎无法找到除内置DI之外的任何信息。

代码: 我的IDbContext界面

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

没有看到IDbSet,这仅仅是因为实体框架?我确实有参考资料。

问题可能是我无法找到实体框架的使用陈述。

更新:

使用Entity framework 8.0.0 beta。将所有IDbset引用更改为DbSet。

然而,在我的通用存储库中,我使用的方法如下:

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

&#34;查找与#34;不是一种方法。我不能再使用&#34; DbEntityValidationException&#34;在我的捕获中。

3 个答案:

答案 0 :(得分:3)

实体框架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; }
}

e.g。

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

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

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

答案 1 :(得分:1)

在实体框架7中IDbSet本身代表了存储库模式的实现。

/// <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>
  

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

DBContext UnitOfWork

的实施。{

答案 2 :(得分:1)

与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正确完成则不用担心。它为您的业务增加了另一层安全性。