gpt4 book ai didi

c# - 对 DbContext 的通用访问

转载 作者:太空狗 更新时间:2023-10-29 20:10:23 25 4
gpt4 key购买 nike

ObjectContext允许对生成的实体进行通用访问。 DbContext似乎没有这样的支持。使用通用存储库访问 EF5 具有挑战性。假设我想要一个通用机制来读取任何给定的实体,称之为 TEntity:

public class DataRepositoryEF5<T> where T: DbContext
{
private ObjectContext _context;

public DataRepositoryEF5(DbContext context)
{
_context = ((IObjectContextAdapter)context).ObjectContext;
}

public IEnumerable<TEntity> ReadAll<TEntity>() where TEntity : class,new()
{
return GetObjectSet<TEntity>().AsEnumerable();
}

protected ObjectSet<TEntity> GetObjectSet<TEntity>() where TEntity : class,new()
{
ObjectSet<TEntity> result;
result = _context.CreateObjectSet<TEntity>();
return result;
}
}

用法

            var context = new MyContext();            
var repository = new DataRepositoryEF5<MyContext>(context);

IEnumerable<Document> results = repository.GetAll<Document>();

foreach (var item in results)
{
Console.WriteLine("{0} {1} {2} {3}", item.Description, item.Id, item.Property, item.Whatever);
}

EF 用于生成具有公共(public)基类型的类 EntityObject .由于不再是这种情况,我可以拥有的最佳约束是 class ...

其次,因为没有 ObjectContext.CreateObjectSet<>() 的等价物我被迫从 DbSet 转换至 ObjectSet .

有了这个模式,我就不需要DbContext了。 .如果没有泛型,我将不得不手动编写所有 CRUD 操作的代码。我错过了什么?如果不是,是否可以告诉 EF5 使用 ObjectContext 生成代码相反?

最佳答案

看看这个tip我前一段时间发布的

无论如何,诀窍是使用 context.Set<>

public interface IEntity
{
int Id { get; set; }
}

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity
{
private IDbContext _context;
public Repository(IDbContext context)
{
_context = context;
}
private IDbSet<TEntity> DbSet
{
get
{
return _context.Set<TEntity>();
}
}
public IQueryable<TEntity> GetAll()
{
return DbSet.AsQueryable();
}
public void Delete(TEntity entity)
{
DbSet.Remove(entity);
}
.....

关于c# - 对 DbContext 的通用访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18151143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com