npgsql和Entity Framework的Code First设置问题

8
我收到的最新错误是:
ERROR: 42P01: relation "dbo.__MigrationHistory" does not exist

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

我目前正在尝试使用Npgsql 2.0.12来设置实体框架4.4的Code First。我已经完成了以下步骤,现在至少似乎可以连接到数据库,但是当我进行context.saveChanges();时会出现上述错误。

  • Updated the machine.config for .net 2.0.50727 with;

    < 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" />

  • Added the dlls to the project

  • Changed the app.config to look like this;

    <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>
    
  • Data passing in looks like the following

    public class Animal { [Key] public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public int Age { get; set; } public int NoOfLegs { get; set; } }

  • Everything else is generic off the shelf set up of contexts

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

附注:对于错误的代码格式化对不起,由于某种原因,堆栈交换不允许我正确使用它,即使它已经正确格式化。


EF 将尝试访问 __MigrationHistory,如果该表不存在,则会捕获异常。这个错误会冒泡到您的应用程序并导致应用程序崩溃吗? - Pawel
这个应用程序非常简单,是一个控制台应用程序,它只是创建了一个上下文,然后执行context.Animals.Add(entity)。在这一点上,它崩溃了,同时这也是由于ef的惰性加载而第一次调用初始化器。我认为错误实际上是在context.SaveChanges()时抛出的。编辑:我知道迁移历史记录不在数据库中,我认为我可能错过了设置Npgsql的步骤,以创建这些所需的表格,或者我是否只需手动添加它们? - Ankou
表格应该自动添加。有堆栈跟踪的机会吗? - Pawel
堆栈跟踪:"在System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata)处 在System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata)处 在System.Data.Entity.Database.CompatibleWithModel(Boolean throwIfNoMetadata)处 在System.Data.Entity.DropCreateDatabaseIfModelChanges1.InitializeDatabase(TContext context)处 在System.Data.Entity.Database.<>c__DisplayClass21.<SetInitializerInternal>b__0(DbContext c)" - Ankou
我已经仔细阅读了这篇文章并删除了数据库,以便从头开始创建,但现在我得到的是数据库还没有被创建。您能否告诉我这个连接字符串是否做了我认为它所做的事情,即在我的本地主机上创建一个名为DataContext的数据库?<connectionStrings> <add name="DataContext" connectionString="Server=127.0.0.1;Port=5432;Database=DataContext;User Id=postgres;Password=******;CommandTimeout=20;" providerName="Npgsql" /> </connectionStrings> - Ankou
显示剩余5条评论
2个回答

17

Npgsql不支持模式创建,因此您必须手动创建数据库。 然后为避免此错误,请在代码的某个地方添加此语句(在您的情况下可能是在Main()函数开头):

Database.SetInitializer<DataContext>(null);

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


抱歉回复晚了,我很少登录Stack Overflow。这似乎是一个有趣的解决方案。我会将您标记为答案,并在找到我试图实现此操作的解决方案时尝试它。谢谢。 - Ankou

7

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接