我正在学习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");
}
有没有办法实现这个目标?
答案 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);
}
}