0

リポジトリ パターンを使用して、EFRepositoryタイプ T の汎用リポジトリを作成しました (ジェネリックを使用)。

AllIncludingエンティティとその子エンティティを取得するために使用されるメソッドがあります。

public IQueryable<T> AllIncluding(params Expression<Func<T, 
                                  object>>[] includeProperties)
{
    IQueryable<T> query = _dbSet;
    foreach (var includeProperty in includeProperties)
    {
        query = query.Include(includeProperty);
    }
    return query;
}

呼び出しで次の構文を使用します。

_machineRepository.AllIncluding(machine => machine.InstalledOS, 
                                machine => machine.LicenceType, 
                                machine => machine.User);

私の Machine クラスは次のようになります (一部の詳細は省略されています)。

public class Machine
{
    public int MachineId { get; set; }

    public int InstalledOSId { get; set; }
    public InstalledOS InstalledOS { get; set; }

    public int LicenceTypeId { get; set; }
    public LicenceType LicenceType { get; set; }

    public int UserId { get; set; }
    public User User { get; set; }
}

私が見つけたのは、マシン エンティティのビュー (ASP.NET MVC 4 ベータ版を使用) をレンダリングするときに、インストールされた OS とライセンスの種類のエンティティが入力されておらず、インスタンス化されているように見えますが、ID は 0 であり、他のプロパティは null です。Machine エンティティでは、InstalledOSId および LicenceTypeId プロパティに正しい ID が直接入力されます。

アプリケーションを AllInclusive メソッドまでデバッグすると、構築された SELECT クエリに正しいテーブルと結合が含まれていることがわかりますが、ダイスはありません。

結果がどうなるかはわかりませんが、コントローラーまでずっと IQueryable を渡しています。ビューのレンダリング (View(results) を返す) が列挙を管理できると仮定していますか?

4

1 に答える 1

0

これは、あなたがここで言ったことの本当に簡単な実装です-おそらく、違いを見つけるために必要なものと比較することができます:

public class Machine
{
    public int MachineId { get; set; }

    public int InstalledOSId { get; set; }
    public InstalledOS InstalledOS { get; set; }

    public int LicenceTypeId { get; set; }
    public LicenceType LicenceType { get; set; }
}

public class InstalledOS
{
    public int InstalledOSId { get; set; }
}

public class LicenceType
{
    public int LicenceTypeId { get; set; }
}

public class Context : DbContext
{
    public DbSet<Machine> Machines { get; set; }
    public DbSet<LicenceType> LicenceTypes { get; set; }
    public DbSet<InstalledOS> InstalledOSs { get; set; }
}

public class Repository<T> where T : class
{
    private DbSet<T> _dbSet;
    public Repository(DbSet<T> dbset)
    {
        _dbSet = dbset;
    }

    public IQueryable<T> AllIncluding(params Expression<Func<T, 
                                      object>>[] includeProperties)
    {
        IQueryable<T> query = _dbSet;
        foreach (var includeProperty in includeProperties)
        {
            query = query.Include(includeProperty);
        }
        return query;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<Context>());
        Context context = new Context();

        InstalledOS os1 = new InstalledOS();
        context.InstalledOSs.Add(os1);

        LicenceType l1 = new LicenceType();
        context.LicenceTypes.Add(l1);

        Machine m1 = new Machine
        {
            InstalledOS = os1, 
            LicenceType = l1
        };
        context.Machines.Add(m1);

        context.SaveChanges();

        Repository<Machine> repo = new Repository<Machine>(context.Machines);

        var query = repo.AllIncluding(m => m.InstalledOS, m => m.LicenceType);
        Machine m2 = query.First();

        Console.WriteLine(m2.InstalledOS.InstalledOSId);
        Console.ReadLine();

    }
}
于 2012-06-11T16:56:31.097 に答える