5

2つのEntityFramework5 Get()メソッドがあり、(i)単一のエンティティがIDで取得し、(ii)単一のエンティティがフィルターを介して取得します。コードについては、以下を参照してください。

internal readonly FallenNovaContext Context;
private readonly DbSet<TEntity> _dbSet;

internal GenericRepository(FallenNovaContext context)
{
    Context = context;
    _dbSet = context.Set<TEntity>();
}

// (i) Get by ID.
public TEntity GetById(int id)
{
    return _dbSet.Find(id);
}

// (ii) Get by filter and optional eager loading includes.
public TEntity Get(
    Expression<Func<TEntity, bool>> filter = null,
    IEnumerable<string> includePaths = null)
{
    IQueryable<TEntity> query = _dbSet;

    if (filter != null)
    {
        query = query.Where(filter);
    }

    if (includePaths != null)
    {
        query = includePaths.Aggregate(query, (current, includePath) => current.Include(includePath));
    }

    return query.SingleOrDefault();
}

私のアプリケーションが成長するにつれて私が見つけたのは、両方の組み合わせを必要とする多くの非ジェネリックメソッドを書いていることです-より具体的には、IDによるジェネリック取得と熱心なロードが必要です関連するエンティティ。

したがって、メソッドシグネチャは次のようになります。

 public TEntity GetById(
     int id,
     IEnumerable<string> includePaths)
 {
       // ???
 }

私はこのように呼ぶことができます:

 User user = UnitOfWork.UserRepository.GetById(117, new List<string>() { "UserRole", "UserStatus" });

またはこのように:

 Car car = UnitOfWork.CarRepository.GetById(51, new List<string>() { "Make", "Model", "Tyres" });

Entity Framework5を使用してTEntityGetById(int id、IEnumerable includePaths)メソッドのロジックをコーディングする方法の提案に関するヘルプをいただければ幸いです。

4

1 に答える 1

2

まず、主キーフィールドを定義するエンティティの基本クラスを記述します。次のようなものが機能する可能性があります。

public abstract class BaseEntity
{
    public int Id {get;set;}
}

次に、リポジトリの基本クラスを記述します。このベースリポジトリ内のすべてのジェネリックメソッドを定義します。このリポジトリにエンティティタイプの汎用パラメータを持たせます。

public class RepositoryBase<TEntity> where TEntity : BaseEntity
{
   public TEntity GetById(
     int id,
     params Expression<Func<TEntity, object>>[] includeList)
     {
            TEntity entity = null;
            ObjectQuery<TEntity> itemWithIncludes = context.Set<TEntity>() as ObjectQuery<TEntity>;
            foreach (Expression<Func<TEntity, object>> path in includeList)
            {
                itemWithIncludes = ((IQueryable)itemWithIncludes.Include(path)) as ObjectQuery<T>;
            }

            IQueryable<TEntity> items = itemWithIncludes.AsQueryable<TEntity>();
            entity = items.Where(p => p.Id == id).SingleOrDefault();
            return entity;
     }
}

更新:@Bernは、基本クラスを宣言する以外に主キーを見つける方法があるかどうか尋ねました。次の質問は、この問題に関するものです。

Entity Framework 4:主キーを見つける方法は?

最初にEntityFrameworkコード。主キーを探す

一方、EF5に他の方法があるかどうかはわかりません。

于 2012-08-14T08:26:28.027 に答える