实体框架:ObjectContext和继承

时间:2012-07-15 17:47:21

标签: asp.net-mvc-3 entity-framework entity-framework-4

我需要在我的班级(CompetenceSpecific)上进行CRUd操作。 能力有三个派生类 - CompetenceFunction,CompetenceArea和CompetenceSpecifc

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

我该如何纠正?请建议一个可以解决我的问题的解决方案。感谢

请检查下面的代码,为了简单起见,我删除了部分代码。

- MODEL

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

public class CompetenceFunction : Competence
{

}

- REPOSITORY和接口

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;
        }
    }

- 我在Repository的这一部分出现了错误

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);

1 个答案:

答案 0 :(得分:2)

您必须通过OfType函数获取派生类型,例如

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

在你的情况下,这意味着只有一个CompetenceRepository服务于所有能力的衍生物。


修改

(评论后)
首先,UoW用于临时存储应在一个批处理中处理的更改(如要提交到数据库的更改)。 GetAll和类似的函数是存储库的东西。

但是你需要存储库吗?我喜欢this post。在开始了解EF时,我会专注于EF的来龙去脉,而不会被周围的建筑分散太多。例如。从内部与上下文直接通信的服务开始,并公开GetCompetenceFunctions,GetCompetenceAreas(使用OfType)和SaveCompetenceFunction等方法....

您可以直接从MVC控制器中的操作方法处理这些服务方法。