我正在进入实体框架,但我不确定我是否错过了代码优先方法中的关键点 .
我正在使用基于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>();
}
}
是否有任何特定原因导致此错误发生?我尝试过启用迁移并启用自动迁移,但没有任何帮助 .
11 回答
把它放在你的自定义
DbContext
类中:如果您的表在启动时未创建,这就是原因 . 您需要在OnModelCreating方法覆盖中告诉DbContext有关它们的信息 .
您可以在此处执行自定义的每实体映射,也可以将它们分成单独的
EntityTypeConfiguration<T>
类 .显然,这个错误很通用,可能有很多原因 . 在我的例子中,它是如下:
.edmx
生成的连接字符串(在Web.config中)无效 . 经过近一天的尝试,我将连接字符串从EF字符串更改为ADO.NET字符串 . 这解决了我的问题 .例如,EF字符串看起来像这样:
ADO.NET字符串如下所示:
资料来源:http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
对我来说,问题是我没有在实体框架的上下文中包含我的数据库集中的实体类 .
问题可能出在连接字符串中 . 确保您的连接字符串适用于SqlClient提供程序,没有与EntityFramework相关的元数据内容 .
您可以尝试从模型中删除表并再次添加 . 您可以通过从解决方案资源管理器中打开.edmx文件来直观地执行此操作 .
脚步:
双击解决方案资源管理器中的.edmx文件
右键单击要删除的表头,然后选择"Delete from Model"
现在再次右键单击工作区并选择"Update Model from Database.."
从表格列表中再次添加表格
清理并构建解决方案
当数据库中的现有表未正确映射到代码第一个模型时,我已经看到此错误 . 具体来说,我在数据库表中有一个char(1),在C#中有一个char . 将模型更改为字符串解决了问题 .
另外还要检查连接字符串 - 模型名称 . 我使用的是两个实体模型,首先是DB . 在配置中,我复制了一个实体连接,重命名了它,并更改了连接字符串部分 . 我没有改变的是模型名称,所以当实体模型正确生成时,当启动上下文时,EF正在查找实体的错误模型 .
看起来很明显写下来,但有四个小时我不会回来 .
听起来很明显,但请确保您没有明确忽略该类型:
modelBuilder.Ignore<MyType>();
添加到配置中的实体(甚至是空实体)的映射将导致实体类型成为上下文的一部分 . 我们有一个与使用空 Map 修复的其他实体没有任何关系的实体 .
如果你先尝试数据库,那么请确保你的表有 primary key
对我来说,问题是我使用了由
ADO.Net
Model(.edmx)生成的connection string
. 更改连接字符串解决了我的问题 .