Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# npgsql和实体框架代码首次设置问题_C#_Entity Framework_Ef Code First_Npgsql - Fatal编程技术网

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