实体框架通用基类

时间:2017-04-24 14:57:15

标签: c# entity-framework generics

我没有选择创建数据第一个实体框架实现。我想扩展生成的类以包含一个通用基类,我可以调用所有基本函数。 (我知道如何更新t4模板)

更新(如果当前不在DB中添加),GetAll,选择(基于参数)和删除功能。我发现了一些我认为可能有用的东西,但它们没有完全合格的命名空间,我无法弄清楚信息的存储位置。

Creating base class for Entities in Entity Framework - 就是这样一个基本上与我的问题重复,但答案并不完整。

具有完全限定名称空间的此基类的示例是什么?

1 个答案:

答案 0 :(得分:0)

即使您有数据库,仍然可以使用Code First。您可以生成模型。取决于您的需求,请参阅两种不同的方法来解决问题。

通用存储库

public abstract class BaseRepository<TEntity> where TEntity : class
{
    protected DbContext context;

    protected BaseRepository(MyDbContext context) 
    {
        this.context = context;
    }

    public List<TEntity> GetAll()
    {
        // Set<TEntity> provides you an access to entity DbSet
        // Just like if you call context.Users or context.[AnyTableName]
        return context.Set<TEntity>().ToList();
    }
}

接下来,您要实现特定于实体的存储库:

public class UserRepository : BaseRepository<User>
{
    public UserRepository(MyDbContext context) : base(context)
    {
    }
}

简单用法示例:

using (var context = new MyDbContext())
{
    var userRepository = new UserRepository(context);
    var users = userRepository.GetAll();
}

只需将您的通用方法放在上下文

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }
    // ... more DbSets

    public List<TEntity> GetAll<TEntity>() where TEntity : class
    {
        return Set<TEntity>().ToList();
    }

    // For entities that implement INamedEntity interface
    // with property Name.
    public TNamedEntity FindByName<TNamedEntity>(string name)
        where TNamedEntity : INamedEntity, class
    {
        return Set<TNamedEntity>()
            .FirstOrDefault(entity => entity.Name == name);
    }
}

我使用nuget package EntityFrameworkDbContextDbSet来自System.Data.Entity命名空间。

希望您能够开始并实施所需的所有方法。