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执行查询