7

我得到的最新错误是

ERROR: 42P01: relation "dbo.__MigrationHistory" does not exist

但我相信这只是因为之前的某些东西没有正确设置。

我目前正在尝试首先设置实体框架 4.4 代码以使用 Npgsql 2.0.12,我已经完成了以下操作,现在它似乎至少正在连接到数据库,但是当我执行 context.saveChanges(); 时给了我上述错误;

  • 将 .net 2.0.50727 的 machine.config 更新为:

    < add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />

  • 将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>
    
  • 传入的数据如下所示

    公共类动物 { [Key] public int Id { get; 放; } 公共字符串名称 { 获取;放; } 公共字符串描述 { 获取;放; } 公共 int 年龄 { 得到;放; } 公共 int NoOfLegs { 得到;放; } }

  • 其他一切都是通用的现成的上下文设置

关于我做错了什么或提示或教程的任何帮助,任何事情都会有所帮助。这只是一个小小的概念证明,但我不介意让它工作。

Ps 对代码格式的错误使用感到抱歉,堆栈交换不会让我出于某种原因正确使用它,即使它的格式正确。

4

2 回答 2

16

Npgsql 不支持创建模式,所以你必须手动创建数据库。然后为避免此错误,请在代码中的某处添加此语句(在您的情况下,它可能位于 Main() 函数的开头):

Database.SetInitializer<DataContext>(null);

而不是 DataContext 使用您的 DbContext 实现。

于 2013-04-30T13:15:55.650 回答
7

我同意 iwanek 之前的回答。更具体地说,我喜欢将语句放在 OnModelCreating 覆盖方法中,以便在创建上下文时始终调用它。

    public class MyDbContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            Database.SetInitializer<MyDbContext>(null);
        }
    }
于 2013-12-19T02:53:38.393 回答