实体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= "data source=(localdb)\v11.0; initial catalog=Blogging; integrated security=True; multipleactiveresultsets=True;"" 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文件来以可视方式执行此操作。
脚步:
- 双击解决scheme资源pipe理器中的.edmx文件
- 右键单击要删除的表头,然后select“从模型中删除”
- 现在再次右键单击工作区并select“从数据库更新模型”
- 再次从表格列表中添加表格
- 清理并构build解决scheme
另一件事要检查你的连接string – 模型名称。 我首先使用了两个实体模型,DB。 在configuration我复制实体连接为一个,重命名它,并更改连接string的一部分。 我没有改变的是模型名称,所以当实体模型正确生成时,当上下文被启动时,EF正在为实体查找错误的模型。
看起来很明显,但有四个小时我不会回来。
听起来很明显,但要确保你没有明确地忽略这个types:
modelBuilder.Ignore<MyType>();
添加到configuration中的实体(甚至是空的)的映射将导致实体types成为上下文的一部分。 我们有一个与其他实体没有任何关系的实体,这个实体是用一张空的地图修复的。
这也可能发生在types结构不同于实体的情况下,如某些数据types不匹配和/或缺less字段。