我的项目有几个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代码?
答案 0 :(得分:0)
实际上,此错误消息
实体类型Pages不是当前上下文模型的一部分
表示类型PageModel
未配置为PortalDbContext
上下文实例的实体类型。您应该遵循约定来构建模型(请参阅this页面,&#34;类型发现&#34;段落),或使用fluent API手动构建模型。
第二种方案适合基于插件的应用程序的动态模型,因为您可以使用自定义算法发现模型类型,并调用DbModelBuilder
方法来组装&#34;汇编&#34;模型。
是否有可能DbSet出DbContext类首先是ASP.Net MVC代码?
简而言之,如果没有DbSet<TEntity>
,您就无法使用DbContext
将DbSet
视为上下文的一部分(AFAIK,DbSet
包含对DbContext
的引用,用于创建DbSet
)。
由于ASP .NET完全是无状态的,通常的方法是创建DbContext
实例(或其工作单元类包装器),执行操作,处理上下文并将其丢弃。将对DbContext
/ DbSet
的引用保持为Web应用程序中的状态至少是无用的。