0

私は Entity Framework/MVC 4 を学習中で、リポジトリの作成と EF の抽象化に関するいくつかのチュートリアルに従い始めました。

私が気付いたのは、EF が既に UnitOfWork/Repository パターンのように見えることです。

を基本クラスとして使用してカスタム DbSet を作成しようとしましDbSet<TEntity>たが、次の例外のために機能しませんでした: 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>public コンストラクターも protected コンストラクターもないため、派生を作成できません。唯一の方法は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 に答える