首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET 5 MVC 6通用存储库模式

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

Stack Overflow用户
提问于 2015-11-11 09:50:53
回答 3查看 5.5K关注 0票数 4

到处找教程之类的东西。

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

我设置了3个类库的.Core.Data.Service,但是IDBset有问题,似乎我的intellisense不喜欢它,我尝试添加System.Data和实体框架6,但是没有任何结果(无法找到it...confusing)。

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

代码:我的IDbContext接口

代码语言:javascript
复制
IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

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

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

更新:

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

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

代码语言:javascript
复制
public virtual T GetById(object id)
{
    return this.Entities.Find(id);
}

“找到”不是一种方法。我再也不能在我的标语里使用"DbEntityValidationException“了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-11 11:18:29

EntityFramework7Beta 8没有附带Find方法。它可能会在最终版本发布之前添加。

在此之前,您必须使用FirstOrDefault方法。

代码语言:javascript
复制
public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

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

代码语言:javascript
复制
public interface IEntity
{
     int Id { get; set; }
}

例如:

代码语言:javascript
复制
 public class GenericRepository<T> : IGenericRepository<T> where T: class, IEntity

来自github问题清单。EF7不执行自动数据验证,因此DbEntityValidationException不存在于EF7中。

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

票数 3
EN

Stack Overflow用户

发布于 2015-11-11 11:20:10

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

代码语言:javascript
复制
/// <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的实现

票数 1
EN

Stack Overflow用户

发布于 2016-03-18 11:41:07

与firste的回答相反,我不相信使用FirstOrDefault,因为它会产生一个选择前1.

在很多情况下,Id应该是唯一的,但有时您可能会有错误设计的Db。如果没有,应用程序应该抛出一个异常(这就是我们正在处理的)。

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

代码语言:javascript
复制
public virtual T GetById(int id)
{
    return this.Entities.SingleOrDefault(x => x.Id == id);
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33647984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档