npgsql 和 Entity Framework 代码第一次设置问题

Posted

技术标签:

【中文标题】npgsql 和 Entity Framework 代码第一次设置问题【英文标题】:npgsql and Entity Framework code first setup problems 【发布时间】:2012-09-14 17:51:11 【问题描述】:

我最近遇到的错误是

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

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

我目前正在尝试首先设置实体框架 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 获取;放; 公共字符串名称 获取;放; 公共字符串描述 获取;放; 公共 int 年龄 得到;放; 公共 int NoOfLegs 得到;放;

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

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

附:对不起,代码格式的使用不当,堆栈交换不会让我出于某种原因正确使用它,即使它的格式正确。

【问题讨论】:

EF 将尝试访问 __MigrationHistory 并在此表不存在时捕获异常。错误是否会出现在您的应用中并导致您的应用崩溃? 这个应用程序非常简单,一个控制台应用程序,它只需创建一个上下文,然后执行一个 context.Animals.Add(entity)。此时它崩溃了,这也是由于 ef 的延迟加载而第一次调用初始化程序。我相信错误实际上是在 context.SaveChanges() 上引发的。编辑:我知道迁移历史不在数据库中,我想我可能错过了设置创建这些所需表的 Npgsql 的步骤,还是我只是手动添加它们? 应该自动添加表格。堆栈跟踪的任何机会? 我目前正在工作,但会尽快为您弄到一份。感谢您的帮助。 错误:“无法检查模型兼容性,因为数据库不包含模型元数据。只能检查使用 Code First 或 Code First 迁移创建的数据库的模型兼容性。” 【参考方案1】:

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

Database.SetInitializer<DataContext>(null);

使用您的 DbContext 实现代替 DataContext。

【讨论】:

抱歉回复晚了,我几乎没有登录到堆栈溢出。这似乎是一个有趣的解决方案。我会把你标记为答案,并在我找出我试图这样做的解决方案时尝试一下。谢谢。【参考方案2】:

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

    public class MyDbContext : DbContext
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        
            Database.SetInitializer<MyDbContext>(null);
        
    

【讨论】:

以上是关于npgsql 和 Entity Framework 代码第一次设置问题的主要内容,如果未能解决你的问题,请参考以下文章

不能在 Entity Framework 6.1.3 和 PostgreSQL 中使用打开的事务

Entity Framework 7 中表和属性的不区分大小写的名称

Entity Freamwork 6连接PostgreSql数据库

csharp 使用Entity Framework和OracleParameters执行查询

为啥 Entity framework Entity Master Details Entity Edit

Entity Framework 和 Sqlite