一直在寻找教程或其他什么地方。
我一直在尝试将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;在我的捕获中。
答案 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正确完成则不用担心。它为您的业务增加了另一层安全性。