【问题标题】:ASP.NET 5 MVC 6 Generic Repository PatternASP.NET 5 MVC 6 通用存储库模式
【发布时间】:2016-02-12 09:25:26
【问题描述】:

一直在到处寻找教程或其他东西。

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

我设置了3个类库.Core.Data.Service,但是IDBset有问题,好像我的智能不喜欢它,我尝试添加System.Data和实体框架6但没有任何运气(找不到它......令人困惑)。

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

代码: 我的IDbContext界面

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

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

问题可能是我找不到实体框架的使用语句。

更新:

使用实体框架 8.0.0 beta。将所有 IDbset 引用更改为 DbSet。

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

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

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

【问题讨论】:

  • 我认为显示一些代码会有所帮助。我的意思是“IDBSet”位于EntityFramework.dll
  • 肯定会抓住我的一些代码
  • 您是否有意引用 Entity Framework 6.1.3? ASP.NET 5 带有Entity Framework 7,但这是完全重写的。
  • 7 不是很稳定吗?实际上,嗯,我应该使用 7 作为其内置的 asp.net 5 inmind。
  • “使用实体框架 8.0.0 beta”...没有这样的事情。你是 EF7 还是 beta8?

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


【解决方案1】:

Entity Framework 7 Beta 8 不附带 Find 方法。它可能会在最终版本之前添加。

在这种情况发生之前,您将不得不使用 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 的更新,而是重写。

【讨论】:

  • 这种情况下需要强制转换,x=> x.Id == (int) id
  • “DbEntityValidationException”怎么办?这似乎不再存在于实体中,是否有替代方案?
  • 丢了丢人啊
【解决方案2】:

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

DBContextUnitOfWork 的实现

【讨论】:

  • 对不起,你是想说我不需要 repos 模式,因为实体已经暗示了一个?
  • @SteveSmithSkId 是的,来自 Microsoft 的开发人员对 EntityFramework 进行了一些架构更改,并以我们通常在 MVC 框架中执行的方式实现了上下文内容。现在它把我当作冗余的代码。在 ASP.NET 5 - MVC 6 中实现 UoW 和存储库......他们还增加了为任何类型的数据库创建自己的数据上下文的架构可能性......无论是关系还是 nosql
  • 不再有 IDbSet (EF Core)。只是想知道他们为什么将其删除。
【解决方案3】:

与 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 是否正确完成。它为您的业务增加了另一个级别的安全性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2011-04-19
    • 1970-01-01
    • 2017-10-31
    • 2012-06-11
    • 1970-01-01
    • 2012-09-05
    • 2011-07-08
    相关资源
    最近更新 更多