实体框架作为UnitOfWork / Repository?

时间:2012-09-18 18:38:08

标签: asp.net-mvc entity-framework unit-of-work

我正在学习Entity Framework / MVC 4,并开始学习有关创建存储库和抽象EF的一些教程。

我注意到EF似乎已经是一个UnitOfWork / Repository模式。

我尝试使用DbSet<TEntity>作为基类创建自定义DbSet,但由于以下异常而无法使其生效:The type 'System.Data.Entity.DbSet<TEntity>' has no constructors defined

这是我正在尝试做的事情:

public class RolesDbSet : DbSet<Role>
{
    public bool IsNameInUse(string name, int id = 0)
    {
        if (id == 0)
            return this.Any(r => r.Name == name);
        return this.Any(r => r.Name == name && r.ID != id);
    }
}

public class MyEntities : DbContext
{
    public MyEntities() : base("MyEntities")
    {
        Database.SetInitializer(new MyDevelopmentInitializer());
    }       

    public RolesDbSet Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<Password> Passwords { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
        base.OnModelCreating(modelBuilder);
    }
}

然后我就能做到这一点:

bool inUse;
using (var db = new MyEntities())
{
    inUse = db.Roles.IsNameInUse("Employee");
}

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

EF already implements repository and unit of work patterns

您无法创建派生DbSet<T>,因为它没有公共构造函数或受保护构造函数。唯一的方法是直接实现IDbSet<T>,这太复杂了。但是,您可以以相同的方式使用扩展方法,而不是使用实例方法,它只会起作用:

public static class RoleExtensions 
{
    public static bool IsNameInUse(this IQueryable<Role> query, string name, int id = 0)
    {
        if (id == 0)
            return query.Any(r => r.Name == name);
        return query.Any(r => r.Name == name && r.ID != id);
    }
}
相关问题