C# 实现此通用存储库、工作单元和存储库工厂
我已经对这个做了一些修改,从我发现这个例子的原始帖子中删除了一个方法。这是通用存储库C# 实现此通用存储库、工作单元和存储库工厂,c#,generics,repository-pattern,entity-framework-4.1,entity-framework,C#,Generics,Repository Pattern,Entity Framework 4.1,Entity Framework,我已经对这个做了一些修改,从我发现这个例子的原始帖子中删除了一个方法。这是通用存储库 /// <summary> /// Repository base class used with DbContext Originally From http://dotnetspeak.com/index.php/2011/03/repository-pattern-with-entity-framework/ /// </summary> /// <typeparam nam
/// <summary>
/// Repository base class used with DbContext Originally From http://dotnetspeak.com/index.php/2011/03/repository-pattern-with-entity-framework/
/// </summary>
/// <typeparam name="TContext">Type of DdContext that this repositiory operates on</typeparam>
public class RepositoryBase<TContext> : IDisposable, IRepositoryBase where TContext : DbContext, IObjectContextAdapter, new()
{
private DbContext _dbContext;
public DbContext CurrentContext { get; set; }
/// <summary>
/// Create new instance of repository
/// </summary>
/// <param name="DbContext">For embeded edmx resource please define base("name=yourAppEntities") in a class derrived from DBContext</param>
public RepositoryBase(DbContext _context)
{
_dbContext = new TContext();
CurrentContext = _dbContext;
}
/// <summary>
/// Select data from database
/// </summary>
/// <typeparam name="TItem">Type of data to select</typeparam>
/// <returns></returns>
public IQueryable<TItem> Select<TItem>()
where TItem : class, new()
{
DbSet<TItem> _set = _dbContext.Set<TItem>();
return _set;
}
/// <summary>
/// Insert new item into database
/// </summary>
/// <typeparam name="TItem">Type of item to insert</typeparam>
/// <param name="item">Item to insert</param>
/// <returns>Inserted item</returns>
public TItem Insert<TItem>(TItem item)
where TItem : class, new()
{
DbSet<TItem> _set = _dbContext.Set<TItem>();
_set.Add(item);
_dbContext.SaveChanges();
return item;
}
/// <summary>
/// Update an item
/// </summary>
/// <typeparam name="TItem">Type of item to update</typeparam>
/// <param name="item">Item to update</param>
/// <returns>Updated item</returns>
public TItem Update<TItem>(TItem item)
where TItem : class, new()
{
DbSet<TItem> _set = _dbContext.Set<TItem>();
_set.Attach(item);
_dbContext.Entry(item).State = System.Data.EntityState.Modified;
_dbContext.SaveChanges();
return item;
}
/// <summary>
/// Delete an item
/// </summary>
/// <typeparam name="TItem">Type of item to delete</typeparam>
/// <param name="item">Item to delete</param>
public void Delete<TItem>(TItem item)
where TItem : class, new()
{
DbSet<TItem> _set = _dbContext.Set<TItem>();
var entry = _dbContext.Entry(item);
if (entry != null)
{
entry.State = System.Data.EntityState.Deleted;
}
else
{
_set.Attach(item);
}
_dbContext.Entry(item).State = System.Data.EntityState.Deleted;
_dbContext.SaveChanges();
}
/// <summary>
/// Dipose repository
/// </summary>
public void Dispose()
{
if (_dbContext != null)
{
_dbContext.Dispose();
_dbContext = null;
}
}
}
忽略_connectionStringget;设置这是为了测试
对我来说,这似乎很难闻,因为您必须硬编码EF connectionstring名称
我想找出一种方法来弹劾一家工厂,这也是通用的。因此,我们可以基于tenty生成一个存储库。这是怎么回事:
public class ContextWrapper : DbContext
{
public ContextWrapper(string ConnectionStringName)
: base("name=" + ConnectionctionStringName)
{ }
}
只有当您有用于映射实体类型的连接字符串到EDMX的信息时,基于TEntity类型的存储库工厂才有意义。但这些信息必须硬编码到工厂,否则我可能不理解你们的问题
顺便说一句,一旦你尝试使用它,你的通用方法将完全失败。它对CRUD操作非常有效,一个实体没有关系,但一旦你开始在真实实体或聚合根上使用它,你就会遇到很多问题。只要浏览标有和的问题,您就会看到。这是什么:
public class ContextWrapper : DbContext
{
public ContextWrapper(string ConnectionStringName)
: base("name=" + ConnectionctionStringName)
{ }
}
只有当您有用于映射实体类型的连接字符串到EDMX的信息时,基于TEntity类型的存储库工厂才有意义。但这些信息必须硬编码到工厂,否则我可能不理解你们的问题
顺便说一句,一旦你尝试使用它,你的通用方法将完全失败。它对CRUD操作非常有效,一个实体没有关系,但一旦你开始在真实实体或聚合根上使用它,你就会遇到很多问题。只要浏览标有and的问题,您就会看到。它在有关系的实体上运行良好,它可以从UnitOfWork中受益,我正在着手。我不明白你怎么能说它会完全失败,你没有这句话的基础。问题其实不是包装类或连接字符串。更多的是关于如何在DBContext存储库中创建通用工厂。它在具有关系的实体上运行良好,它可以从UnitOfWork中受益,我正在着手。我不明白你怎么能说它会完全失败,你没有这句话的基础。问题其实不是包装类或连接字符串,而是如何在DBContext的存储库中创建通用工厂。