一尘不染

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

c#

我正在进入实体框架,但是不确定是否缺少代码优先方法的关键点。

我正在使用基于https://genericunitofworkandrepositories.codeplex.com/中的代码的通用存储库模式,并创建了我的实体。

但是,当我尝试访问或修改实体时,会遇到以下问题:

System.InvalidOperationException:实体类型Estate不属于当前上下文模型。

当我尝试从存储库访问它时会发生这种情况:

public virtual void Insert(TEntity entity)
{
    ((IObjectState)entity).ObjectState = ObjectState.Added;
    _dbSet.Attach(entity); // <-- The error occurs here
    _context.SyncObjectState(entity);
}

可以很好地创建数据库(./SQLEXPRESS),但是在启动时不创建实体(表)。

我想知道是否需要显式设置实体的映射?EF自己不能做到这一点吗?

我的实体是:

public class Estate : EntityBase
{
    public int EstateId { get; set; }
    public string Name { get; set; }
}

我的情况是这样的:

public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
    public DimensionWebDbContext() :
        base("DimensionWebContext")
    {
        Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
        Configuration.ProxyCreationEnabled = false;
    }

    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }

}

是否有任何特定原因导致此错误发生?我尝试了启用迁移并启用自动迁移而没有任何帮助。


阅读 970

收藏
2020-05-19

共1个答案

一尘不染

将其放在您的自定义DbContext类中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

如果您的表不是在启动时创建的,这就是原因。您需要在OnModelCreating方法重写中告诉DbContext有关它们的信息。

您可以在此处进行自定义每个实体的映射,也可以将它们分成单独的EntityTypeConfiguration<T>类。

2020-05-19