jan*_*ann 135 c# entity-framework ef-code-first dbcontext
我正在进入实体框架,但我不确定我是否错过了代码优先方法中的关键点.
我正在使用基于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);
}
Run Code Online (Sandbox Code Playgroud)
数据库(./SQLEXPRESS)创建得很好,但实体(表)不是在启动时创建的.
我想知道我是否需要显式设置实体的映射?EF不能自己做到这一点吗?
我的实体是:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的背景如下:
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>();
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何特定原因导致此错误发生?我已尝试启用迁移并启用自动迁移,而无需任何帮助.
dan*_*wig 133
把它放在你的自定义DbContext类中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Estate>().ToTable("Estate");
}
Run Code Online (Sandbox Code Playgroud)
如果您的表未在启动时创建,这就是原因.您需要在OnModelCreating方法覆盖中告诉DbContext有关它们的信息.
您可以在此处执行自定义每实体映射,也可以将它们分成单独的EntityTypeConfiguration<T>类.
Chr*_*aks 68
显然,这个错误非常通用,可能有很多原因.在我的例子中,它是如下:由生成的连接字符串(在Web.config中).edmx无效.经过近一天的尝试,我将连接字符串从EF字符串更改为ADO.NET字符串.这解决了我的问题.
例如,EF字符串看起来像这样:
<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>
Run Code Online (Sandbox Code Playgroud)
ADO.NET字符串如下所示:
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;Database=Blogging;
Integrated Security=True;"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
资料来源:http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
Dem*_*ave 14
对我来说,问题是我没有在实体框架的上下文中包含我的数据库集中的实体类.
public DbSet<ModelName> ModelName { get; set; }
Run Code Online (Sandbox Code Playgroud)
小智 9
您可以尝试从模型中删除表并再次添加.您可以通过从解决方案资源管理器中打开.edmx文件来直观地执行此操作.
脚步:
通过更新连接字符串的元数据部分解决了我的问题。显然它指向错误的 .csdl / .ssdl / .msl 引用。