使用未指定实体的实体框架中的通用CRUD

时间:2017-11-17 12:19:43

标签: c# .net entity-framework generics

我试图为我的项目制作通用CRUD。但是我使用了DataBaseFirst,我没有看到如何拥有可以继承的通用Entity类。好吧,它没有丝毫意义,最终当我升级银行时,它将不得不进入所有超过60个类的表并再次添加继承。我想要Entity Framawork生成的实体类是纯的,比如生成的。

所以我尝试了类似的事情:

public class DaoEF<TEntity> : IDaoEF<TEntity>
    where TEntity : class
{
    public GPSdEntities _dbContext { get; set; } = new GPSdEntities();


    public async Task<TEntity> GetById(int id)
    {
        return await _dbContext.Set<TEntity>()
                    .AsNoTracking()
                    .FirstOrDefaultAsync(e => e.Id == id);
    }

但是你可以推断出我对这个属性没有被定义的问题,因为正如我所说,我不希望有像#34; General Entity&#34;。

有谁知道我能做到这一点的任何方式?也许它有一些Entity默认使用的类,可以在where限制中使用。或者也许如果不使用泛型我使用反射?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

经过多次搜索后,我发现这篇文章是葡萄牙文:https://msdn.microsoft.com/en-us/library/dn630213.aspx

在泛型类中使用这些泛型方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using Repositorio.DAL.Contexto;
namespace Repositorio.DAL.Repositorios.Base
{
public abstract class Repositorio<TEntity> : IDisposable,
   IRepositorio<TEntity> where TEntity : class
{
    BancoContexto ctx = new BancoContexto();
    public IQueryable<TEntity> GetAll()
    {
        return ctx.Set<TEntity>();
    }

    public IQueryable<TEntity> Get(Func<TEntity, bool> predicate)
    {
        return GetAll().Where(predicate).AsQueryable();
    }

    public TEntity Find(params object[] key)
    {
        return ctx.Set<TEntity>().Find(key);
    }

    public void Atualizar(TEntity obj)
    {
        ctx.Entry(obj).State = EntityState.Modified;
    }

    public void SalvarTodos()
    {
        ctx.SaveChanges();
    }

    public void Adicionar(TEntity obj)
    {
        ctx.Set<TEntity>().Add(obj);
    }

    public void Excluir(Func<TEntity, bool> predicate)
    {
        ctx.Set<TEntity>()
            .Where(predicate).ToList()
            .ForEach(del => ctx.Set<TEntity>().Remove(del));
    }

    public void Dispose()
    {
        ctx.Dispose();
    }
}

}