0

クラス (CompetenceSpecific) で CRUd 操作が必要です。Competence には、CompetenceFunction、CompetenceArea、および CompetenceSpecifc の 3 つの派生クラスがあります。

The error I recieved: 
  There are no EntitySets defined for the specified entity type 'CompetencyManagement.Domain.Entities.CompetenceFunction'. If 'CompetencyManagement.Domain.Entities.CompetenceFunction' is a derived type, use the base type instead. Parameter name: TEntity

これをどのように修正すればよいですか?私の問題を解決する解決策を提案してください。ありがとう

以下のコードを確認してください。わかりやすくするために、コードの一部を削除しました。

- モデル

public class Competence
{
    public int CompetenceID { get; set; }
    public int CourseID { get; set; }
...
}

public class CompetenceFunction : Competence
{

}

-- リポジトリとインターフェース

public interface IRepository<T> where T : class
{
    T GetById(object id);
    IEnumerable<T> GetAll();
    IEnumerable<T> Query(Expression<Func<T, bool>> filter);
    void Add(T entity);
    void Remove(T entity);
}

public abstract class Repository<T> : IRepository<T>
    where T : class
{
    protected IObjectSet<T> _objectSet;

    public Repository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<T>();
    }
...
}


public class CompetenceFunctionRepository : Repository<CompetenceFunction>
{
    public CompetenceFunctionRepository(ObjectContext context)
        : base(context)
    {
    }

    public override CompetenceFunction GetById(object id)
    {
        return _objectSet.SingleOrDefault(s => s.CompetenceID == (int)id);
    }
}

-- 作業単位

public interface IUnitOfWork
{
    IRepository<CompetenceFunction> CompetenceFunctions { get; }
    IRepository<CompetenceArea> CompetenceAreas { get; }
    IRepository<CompetenceSpecific> CompetenceSpecifics { get; }
    void Commit();
}

public class UnitOfWork : IUnitOfWork, IDisposable
{
    private CompetenceFunctionRepository _competencefunction;
    private CompetenceAreaRepository _competencearea;
    private CompetenceSpecificRepository _competencespecifc;

    public UnitOfWork(ObjectContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("Context was not supplied");
        }

        _context = context;
    }

    #region IUnitOfWork Members


    public IRepository<CompetenceFunction> CompetenceFunctions
    {
        get
        {
            if (_competencefunction == null)
            {
                _competencefunction = new CompetenceFunctionRepository(_context);
            }

            return _competencefunction;
        }
    }

    public IRepository<CompetenceArea> CompetenceAreas
    {
        get
        {
            if (_competencearea == null)
            {
                _competencearea = new CompetenceAreaRepository(_context);
            }

            return _competencearea;
        }
    }

    public IRepository<CompetenceSpecific> CompetenceSpecifics
    {
        get
        {
            if (_competencespecifc == null)
            {
                _competencespecifc = new CompetenceSpecificRepository(_context);
            }

            return _competencespecifc;
        }
    }

-- リポジトリのこの部分でエラーが発生しています

public Repository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<T>();
    }


  There are no EntitySets defined for the specified entity type 'CompetencyManagement.Domain.Entities.CompetenceFunction'. If 'CompetencyManagement.Domain.Entities.CompetenceFunction' is a derived type, use the base type instead. Parameter name: TEntity

コントローラーに実装する方法は次のとおりです

 private IUnitOfWork _unitOfWork;
 var a = _unitOfWork.CompetenceFunctions.GetAll();
 return View(a);
4

1 に答える 1

2

OfType関数によって派生型を取得する必要があります。

context.CreateObjectSet<Competence>().OfType<CompetenceFunction>()

あなたの場合、それは Competence のすべての派生物を提供する CompetenceRepository しかないことを意味します。


編集

(コメントの後)
最初に、UoWは、1つのバッチで処理する必要がある変更(データベースにコミットする変更など)を一時的に保存するためのものです。GetAll同様の機能はリポジトリのものです。

しかし、リポジトリは必要ですか? 私はこの投稿が好きです。EF を理解し始めたとき、周囲のアーキテクチャにあまり気を取られることなく、EF の内外に集中しました。たとえば、内部でコンテキストと直接通信し、GetCompetenceFunctions、GetCompetenceAreas (使用OfType)、 SaveCompetenceFunction などのメソッドを公開するサービスから始めます。

これらのサービス メソッドは、MVC コントローラーのアクション メソッドから直接アドレス指定できます。

于 2012-07-15T23:47:11.507 に答える