Tag: repository pattern

使用具有流畅的nHibernate的Generic Repository模式

我目前正在开发一个中型应用程序,它将访问不同站点上的两个或更多SQL数据库等… 我正在考虑使用类似的东西: http : //mikehadlow.blogspot.com/2008/03/using-irepository-pattern-with-linq-to.html 但是,我想使用流畅的nHibernate代替Linq-to-SQL(当然还有nHibernate.Linq) 这可行吗? 我该如何配置呢? 我的映射定义会在哪里等…? 该应用程序最终将具有许多方面 – 来自WebUI,WCF库和Windows应用程序/服务。 另外,例如在“产品”表上,我是否会创建一个“ProductManager”类,它具有以下方法: GetProduct,GetAllProducts等…… 任何指针都非常受欢迎。

使用预先加载的存储库通用方法GetById

我正在使用Entity Framework,并希望在Repository类中使用eager loading创建通用的GetById方法: 这是我使用延迟加载的方法: public virtual TEntity GetById(object id) { return DbSet.Find(id); } 我知道方法Find不支持预先加载,但是如何修改此方法以使用预先加载,以便我使用此方法如下(例如): _unitOfWork.MyRepository.GetById(includeProperties: “Users”);

通用存储库,CreateObjectSet ()方法

我试图实现一个通用的存储库,我现在就有这个: using System; using System.Collections.Generic; using System.Linq; using System.Data; using System.Data.Entity.Core.Objects; using Web_API.Models; namespace Web_API.DAL { class GenericRepository : IRepository where T : class { private ApplicationDbContext entities = null; IObjectSet _objectSet; public GenericRepository(ApplicationDbContext _entities) { entities = _entities; _objectSet = entities.CreateObjectSet(); } … 我在使用此方法调用时遇到问题: entities.CreateObjectSet(); 它应该没问题,但我得到这个错误: 我已经将System.Data.Entity添加到我的项目中,此时我不知道还能做什么。 我正在关注本教程http://www.codeproject.com/Articles/770156/Understanding-Repository-and-Unit-of-Work-Pattern 。 有谁知道如何解决这个问题?

通用存储库是否需要在任何地方应用基本实体类?

我正在使用ASP.NET MVC和Onion Architecture创建一个Intranet网站。 我一直在实现存储库模式,但我遇到了困难。 假设我有一个带有IDDocument的Document表。 那么这是我的回购(只有一种方法): class Repository : IRepository where T : class { private readonly PrincipalServerContext context; private DbSet entities; //Constructor and stuff here public T Get(long id) { return entities.SingleOrDefault(s => s.IDDocument == id);//Here is my problem } } 问题是我不能使用它,因为T不被识别为来自Document表。 解决方案是创建一个BaseEntity: public class BaseEntity{ public int ID{get;set;} } 然后我的文件POCO变成: public class Document […]

应该在Repository还是Service层中编写复杂的查询?

我计划将数据访问层迁移到使用存储库模式和工作单元。 我知道存储库将帮助我轻松地将持久性存储(数据库,集合等)和EF等技术更改为MongoDB。 所以我注意到了一些存储库实现的关键点,例如: 返回IEnumerable而不是IQueryable 存储库应仅对CRUD操作负责 存储库方法的返回类型应该是模型(实体) 仅实现聚合根的存储库 如果我在项目中的实现存储库中应用这些关键点,我完全忘记了如何处理与多个实体相关的复杂查询。 目前我已经拥有的是在BLL库上有很多服务类将直接联系到EF的DbContext和DbSet以及一些这样的validation: public IEnumerable GetProjectWithDetails() { // Validation // Logging // Can be any logic need to before query data. Dbcontext.Projects.Where(p => // multiple of conditions go here follow business rules // conditions will need to check another entities (task, phase, employee…) such as: // 1. project have […]

.net中的存储库模式和inheritance

我对存储库设计模式很陌生,在尝试实现它时,我已经达到了死胡同,关于inheritance。 即使我开始朝着正确的方向前进,我也不确定。 所以基本上我将有一个抽象基类Product,例如id和imagePath,并且将有几个inheritance自此的产品。 namespace Common { public abstract class Product { public int Id { get; set; } public string ImgPath { get; set; } } public class Scale : Product { public int AdditionalProperty { get; set; } } } 现在存储库如下: public class BaseRepository { protected TEstEntities1 _dataContext = new TEstEntities1(); public BaseRepository() { […]

如何使用存储库模式和entity framework连接多个表?

我需要使用存储库模式和entity framework(使用C#)连接多个表。 这可能吗? 如果是这样,请告诉我如何做同样的事情。

使用具有entity framework6的存储库模式更新记录

我正在编写一个简单的博客应用程序,并尝试在我的通用存储库模式中建立CRUD操作,但我的更新方法出现错误,说: ‘System.Data.Entity.DbSet’不包含’Entry’的定义,并且没有扩展方法’Entry’可以找到接受类型’System.Data.Entity.DbSet’的第一个参数(你是否缺少using指令)或汇编参考?) 我跟着一篇post解释了如何通过在DbContext上添加额外的间接级别来“伪造”Entry()。 但是在MVC 5中我们inheritance自: IdentityDbContext而不是DbContext。 我确实尝试实现作者修复,但错误仍然存​​在。 我的问题 如何使用IdentityDbContext将更新方法添加到Entity Framework 6中的存储库? 如果我们不应该这样做,那么如何使用这种模式更新记录? 我应该注意到其他所有方法都按预期工作。 我的通用存储库: public class BlogEngineRepository : IRepository where T : class { protected DbSet DbSet; public BlogEngineRepository(DbContext dataContext) { DbSet = dataContext.Set(); } #region IRepository Members public void Insert(T entity) { DbSet.Add(entity); } public void Delete(T entity) { DbSet.Remove(entity); } public void Update(T […]

如何实现通用的GetById(),其中Id可以是各种类型

我正在尝试实现一个通用的GetById(T id)方法,该方法将满足可能具有不同ID类型的类型。 在我的示例中,我有一个实体,其ID类型为int ,类型为string 。 但是,我一直收到错误,我不明白为什么: 类型’int’必须是引用类型才能在方法IEntity的generics类型中将其用作参数’TId’ 实体接口: 为了满足我的域模型,可以使用类型为int或string Id。 public interface IEntity where TId : class { TId Id { get; set; } } 实体实施: public class EntityOne : IEntity { public int Id { get; set; } // Other model properties… } public class EntityTwo : IEntity { public string Id { get; […]

存储库/ IQueryable /查询对象

我正在构建一个存储库,我在很多地方看到了2个不在存储库外暴露IQueryable的原因。 1)首先是因为不同的LINQ提供者可能表现不同,这种差异应该包含在存储库中。 2)第二是防止服务级别开发人员修改数据库查询,以免意外导致性能问题。 我想问题2只能通过将所有查询逻辑保留在存储库中并且不允许任何forms的外部查询构建来防止? 但这对我来说似乎有点不切实际。 问题1似乎可以通过使用数据对象模式来解决。 例如public IEnumerable FindBy(Query query) 我的问题是,为什么我不仅仅传递一个lambda表达式,因为它与提供者无关,似乎为我提供了与查询对象相同的function,以及相同的分离级别? 例如public IEnumerable FindBy(Expression<Func> predicate) 有什么理由不这样做吗? 它违反了一些规则吗? 最佳做法? 我应该知道的吗?