0

我正在学习 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");
}

有没有办法做到这一点?

4

1 回答 1

2

的,EF 已经实现了存储库和工作单元模式

您不能创建派生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);
    }
}
于 2012-09-18T18:47:34.367 回答