DbSet在DbContext类之外

时间:2014-11-25 11:19:43

标签: c# asp.net asp.net-mvc entity-framework ef-code-first

我的项目有几个Areas,其中每个人都有自己的实体,而我正试图让一切都隔离在那个区域......(让我们称这些区域= plugins
的DbContext

public class PortalDbContext : DbContext, IUnitOfWork
{
    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
    {
        return base.Set<TEntity>();
    }
}

IUnitOfWork

 public interface IUnitOfWork
    {
        int SaveChanges();
        IDbSet<TEntity> Set<TEntity>() where TEntity : class;
    }

Service.cs

public class PageService : IPage
{
    public readonly IUnitOfWork _uow;
    public readonly IDbSet<Pages> _page;

    public PageService(IUnitOfWork uow)
    {
        _uow = uow;
        _page = uow.Set<Pages>();
    }
}

最后当我尝试时:

public void AddPage(PageModel m)
{
    _page.Add(m);
}

我收到此错误: The entity type Pages is not part of the model for the current context
这意味着uow.Set<Pages>();无效。
DbSet类中的DbContext是否可能首先是ASP.Net MVC代码?

1 个答案:

答案 0 :(得分:0)

实际上,此错误消息

  

实体类型Pages不是当前上下文模型的一部分

表示类型PageModel未配置为PortalDbContext上下文实例的实体类型。您应该遵循约定来构建模型(请参阅this页面,&#34;类型发现&#34;段落),或使用fluent API手动构建模型。

第二种方案适合基于插件的应用程序的动态模型,因为您可以使用自定义算法发现模型类型,并调用DbModelBuilder方法来组装&#34;汇编&#34;模型。

  

是否有可能DbSet出DbContext类首先是ASP.Net MVC代码?

简而言之,如果没有DbSet<TEntity>,您就无法使用DbContextDbSet视为上下文的一部分(AFAIK,DbSet包含对DbContext的引用,用于创建DbSet)。

由于ASP .NET完全是无状态的,通常的方法是创建DbContext实例(或其工作单元类包装器),执行操作,处理上下文并将其丢弃。将对DbContext / DbSet的引用保持为Web应用程序中的状态至少是无用的。