使用泛型类型的EntityFramework的CRUD操作

时间:2017-04-28 10:22:47

标签: c# entity-framework generics

我希望能够使用类型为T的通用服务类,它允许我动态查询数据库。例如。通常我会做这样的事情来删除记录

public void Delete(Post post)
{
    this._context.Posts.Remove(post);
}

我希望能够做到这一点

public void Delete(T post)
{
    this._context<T>.Remove(post);
}

我在这里发现了一篇文章,它上面有一些画笔,但是如果看起来不像是一种干净的方式来实现它。 https://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework/

2 个答案:

答案 0 :(得分:4)

您需要DbContext.Set

https://msdn.microsoft.com/en-us/library/gg679544(v=vs.113).aspx

  

返回一个非泛型DbSet实例,用于访问上下文和底层存储中给定类型的实体

public void Delete<T>(T post)
    where T : class
{
    this._context.Set<T>.Remove(post);
}

稍后,您还可以根据以下内容进行查询:

this._context.Set<T>.AsQueryable().Where(predicate);

在这种情况下,predicate将是Expression<Func<T, bool>>

所以你可以有一个通用的查询方法:

public IEnumerable<T> Query<T>(Expression<Func<T, bool>> predicate)
    where T : class
{
    return this._context.Set<T>().AsQueryable().Where(predicate).ToList();
}

...但我现在稍微偏离了这个问题!

答案 1 :(得分:0)

您可以使用Generic存储库模式

public class Sample
{
    public void AddNewPerson(Person newPerson)
    {
        var personRepo = new Repository<Person>();
        personRepo.Insert(newPerson);
        personRepo.SaveChanges();
    }

    public void DeletePerson(int personId)
    {
        var personRepo = new Repository<Person>();
        Person person= personRepo.Find(p => p.Id == personId).SingleOrDefault();
        personRepo.Delete(person);
    }
}

用法:

XML