繁体   English   中英

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

[英]ASP.NET 5 MVC 6 Generic Repository Pattern

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

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

我设置了3个类库.Core.Data.Service ,然而IDBset存在问题,似乎我的intellisense不喜欢它,我试图添加System.Data和Entity框架6但没有任何运气(无法找到它) ...混乱)。

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

代码:我的IDbContext接口

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

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

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

更新:

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

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

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

“查找”不是一种方法。 我不能再在我的捕获中使用“DbEntityValidationException”。

实体框架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问题列表 EF7不执行自动数据验证,因此EF7中不存在DbEntityValidationException。

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

在Entity Framework 7中, 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>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM