C# npgsql和实体框架代码首次设置问题
我最近收到的错误是C# npgsql和实体框架代码首次设置问题,c#,entity-framework,ef-code-first,npgsql,C#,Entity Framework,Ef Code First,Npgsql,我最近收到的错误是 ERROR: 42P01: relation "dbo.__MigrationHistory" does not exist 但我确信这只是因为之前的一些设置不正确 我目前正在尝试先设置entity framework 4.4代码以使用Npgsql 2.0.12,我已经完成了以下操作,现在它似乎至少连接到了数据库,但在执行context.saveChanges()时出现了上述错误 使用更新了.net 2.0.50727的machine.config 已将DLL添加到项目
ERROR: 42P01: relation "dbo.__MigrationHistory" does not exist
但我确信这只是因为之前的一些设置不正确
我目前正在尝试先设置entity framework 4.4代码以使用Npgsql 2.0.12,我已经完成了以下操作,现在它似乎至少连接到了数据库,但在执行context.saveChanges()时出现了上述错误
- 使用更新了.net 2.0.50727的machine.config
- 已将DLL添加到项目中
- 将app.config更改为如下所示
<configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <system.data> <DbProviderFactories> <remove invariant="Npgsql"></remove> <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="DataContext" connectionString="Server=127.0.0.1;Port=5432;Database=postgres;User Id=postgres;Password=*******;CommandTimeout=20;" providerName="Npgsql" /> </connectionStrings> </configuration>
- 传入的数据如下所示 公营动物 { [关键] 公共int Id{get;set;} 公共字符串名称{get;set;} 公共字符串说明{get;set;} 公共整数{get;set;} 公共int NoOfLegs{get;set;} }
- 其他所有内容都是通用的现成上下文设置
另外,很抱歉错误地使用了代码格式,由于某些原因,堆栈交换将不允许我正确使用它,即使它的格式正确 Npgsql不支持模式创建,因此您必须手动创建db。 然后,为了避免此错误,请在代码中的某个位置添加此语句(在您的情况下,它可能位于Main()函数的开头):
Database.SetInitializer(null);
使用DbContext实现代替DataContext。我同意iwanek前面的回答。更具体地说,我喜欢将语句放在OnModelCreating override方法中,以便在创建上下文时始终调用它
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext>(null);
}
}
公共类MyDbContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
Database.SetInitializer(null);
}
}
EF将尝试访问迁移历史记录,如果此表不存在,将捕获异常。该错误是否会影响你的应用程序并导致你的应用程序崩溃?该应用程序非常简单,是一个控制台应用程序,它只是创建了一个上下文,然后创建了一个context.anives.Add(实体)。在这一点上它崩溃了,这也是由于ef的延迟加载而第一次调用初始化器。我相信这个错误实际上是在context.SaveChanges()上抛出的。编辑:我知道迁移历史记录不在数据库中,我想我可能在设置创建这些所需表的Npgsql时错过了一个步骤,还是我只是手动添加它们?表应该自动添加。有没有可能进行堆栈跟踪?我目前正在工作,但会尽快为您找到一个。感谢您的帮助。错误:“无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用代码优先或代码优先迁移创建的数据库的模型兼容性。”很抱歉,回复太晚,我刚刚登录。这似乎是一个有趣的解决方案。我会将你标记为答案,并在某个时候尝试,当我找到解决方案时,我正在尝试这样做。非常感谢。
public class MyDbContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyDbContext>(null);
}
}