实体types<type>不是当前上下文的模型的一部分

我正在进入entity framework,但我不确定是否缺less代码优先方法中的关键点。

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

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

System.InvalidOperationException:实体typesEstate不是当前上下文的模型的一部分。

它发生在我试图从我的存储库访问它时:

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

数据库(./SQLEXPRESS)创build得很好,但实体(表)只是在启动时没有创build。

我想知道如果我需要明确设置实体的映射? 英孚不能通过它自己?

我的实体是:

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

有什么具体的原因,为什么会发生这种错误? 我已经尝试启用迁移,并启用自动迁移没有任何帮助。

把它放在你自定义的DbContext类中:

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

如果你的表没有在启动时创build,这就是为什么。 您需要在OnModelCreating方法覆盖中告诉DbContext关于它们的信息。

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

显然,这个错误是非常通用的,可能有很多原因。 在我的情况下,它是以下内容:由.edmx生成的连接string(在Web.config中)是无效的。 经过将近一天的尝试,我将连接string从EFstring更改为ADO.NETstring。 这解决了我的问题。

例如,EFstring看起来像这样:

 <connectionStrings> <add name="BlogContext" connectionString="metadata=res://*/BloggingModel.csdl| res://*/BloggingModel.ssdl| res://*/BloggingModel.msl; provider=System.Data.SqlClient provider connection string= &quot;data source=(localdb)\v11.0; initial catalog=Blogging; integrated security=True; multipleactiveresultsets=True;&quot;" providerName="System.Data.EntityClient" /> </connectionStrings> 

而ADO.NETstring如下所示:

 <connectionStrings> <add name="BlogContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=Blogging; Integrated Security=True;"/> </connectionStrings> 

来源: http : //msdn.microsoft.com/nl-nl/data/jj556606.aspx

问题可能在连接string中。 确保你的连接string是SqlClient提供者,没有与EntityFramework相关的元数据。

对我来说,问题是我没有在entity framework的上下文中包含我的数据库集中的实体类。

 public DbSet<ModelName> ModelName { get; set; } 

我已经看到这个错误,当数据库中的一个现有的表没有适当地映射到代码的第一个模型。 具体来说,我有一个在数据库表中的char(1)和在C#中的字符。 将模型更改为string可以解决问题。

您可以尝试从模型中删除表格并重新添加。 您可以通过从解决scheme资源pipe理器打开.edmx文件来以可视方式执行此操作。

脚步:

  1. 双击解决scheme资源pipe理器中的.edmx文件
  2. 右键单击要删除的表头,然后select“从模型中删除”
  3. 现在再次右键单击工作区并select“从数据库更新模型”
  4. 再次从表格列表中添加表格
  5. 清理并构build解决scheme

另一件事要检查你的连接string – 模型名称。 我首先使用了两个实体模型,DB。 在configuration我复制实体连接为一个,重命名它,并更改连接string的一部分。 我没有改变的是模型名称,所以当实体模型正确生成时,当上下文被启动时,EF正在为实体查找错误的模型。

看起来很明显,但有四个小时我不会回来。

听起来很明显,但要确保你没有明确地忽略这个types:

modelBuilder.Ignore<MyType>();

添加到configuration中的实体(甚至是空的)的映射将导致实体types成为上下文的一部分。 我们有一个与其他实体没有任何关系的实体,这个实体是用一张空的地图修复的。

这也可能发生在types结构不同于实体的情况下,如某些数据types不匹配和/或缺less字段。