我遇到与Entity Framework 5.0 PostgreSQL (Npgsql) default connection factory
类似的问题我在app.config中声明了Npgsql:
<connectionStrings>
<add name="monDbContexte"
connectionString="Server=127.0.0.1;Port=5432;Database=ma_datab_db;User Id=postgres;Password=root;"
providerName="Npgsql" />
</connectionStrings>
<!-- le factory provider -->
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
support="FF"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
</configuration>
我的上下文提供程序类:
public class ContextDB: DbContext
{
public DbSet<Personne> Personnes { get; set; }
public ContextDB()
: base("monDbContexte")
{
}
}
我的“Personne”课程:
[表格(“personnes”,Schema =“public”)] 公共阶层Personne { [键] [柱( “id_personne”)] [显示(名称= “Identifiant”)] public int id {get;组; }
[Column("nom")]
[Display(Name = "Nom")]
[Required(ErrorMessage = "Merci de saisir le nom.")]
public string Nom { get; set; }
[Column("prenom")]
[Display(Name = "Prénom")]
[Required(ErrorMessage = "Merci de saisir le prénom.")]
public string Prenom { get; set; }
...
...
}
在我的控制器动作中,我做了类似这样的事情:
using (var context = new ContextDB())
{
// *** here i have an exception...
var personnes = from p in context.Personnes
where p.Nom.StartsWith("m")
orderby p.Nom
select new { p.Nom, p.Prenom };
foreach (var une_personne in personnes)
{
Console.WriteLine(une_personne.Nom + " " + une_personne.Prenom);
}
在此之后我有这样的例外:
ERROR: schema "dbo" does not exist
这是一个NpgsqlException
[法国]
ERREUR:3F000:leschéma«dbo»n'existe pas
我不知道这个
有什么问题编辑:
这是个例外:
(对不起,但是用法语)
PS:我在“ C:\ projects \ Npgsql2 ”中没有任何项目,我在当前项目中没有这样的路径,所以这是什么?
L'exception Npgsql.NpgsqlException n'a pas été gérée par le code utilisateur
HResult=-2147467259
Message=ERREUR: 3F000: le schéma « dbo » n'existe pas
Source=Npgsql
ErrorCode=-2147467259
BaseMessage=le schéma « dbo » n'existe pas
Code=3F000
Detail=""
ErrorSql=SELECT "GroupBy1"."A1" AS "C1" FROM (SELECT CAST (count(1) AS int4) AS "A1" FROM "dbo"."__MigrationHistory" AS "Extent1Group") AS "GroupBy1"
File=src\backend\catalog\namespace.c
Hint=""
Line=2826
Position=82
Routine=get_namespace_oid
Severity=ERREUR
Where=""
StackTrace:
à Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext() dans C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:ligne 850
à Npgsql.ForwardsOnlyDataReader.GetNextResponseObject() dans C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:ligne 1173
à Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() dans C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:ligne 1191
à Npgsql.ForwardsOnlyDataReader.NextResult() dans C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:ligne 1377
à Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean synchOnReadError) dans C:\projects\Npgsql2\src\Npgsql\NpgsqlDataReader.cs:ligne 1040
à Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) dans C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:ligne 611
à Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) dans C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:ligne 588
à Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) dans C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:ligne 538
à System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
à System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
InnerException:
答案 0 :(得分:4)
似乎EF使用dbo作为数据库的默认架构。您需要将其更改为“public”,这是Postgresql的默认架构。
您可以通过导入命名空间来使用它:
using System.ComponentModel.DataAnnotations;
并注释您的类以使用不同的架构:
[Table("mytable", Schema = "public")]
Class test {...}
有关更多信息,请查看我关于EF和Npgsql的帖子:http://fxjr.blogspot.com/2013/06/npgsql-code-first-entity-framework-431.html
我希望它有所帮助。
答案 1 :(得分:0)
我有同样的问题。
不知道为什么,但是当我在Database.SetInitializer
方法中没有使用Application_Start()
时,它就没事了。
所以:
//Database.SetInitializer<ContextDB>(new ContextDBInitializer());
答案 2 :(得分:0)
我的解决方案:
public class PostgisDbContext : DbContext
{
public PostgisDbContext() : base("Postgis")
{
//begin
try
{
this.Database.Initialize(false); issue
}
catch (Exception)
{}
//end
}
}
它可能不完美但有效。
答案 3 :(得分:0)
我使用了EntitiyFramework6 6.2.0,EntityFramework6.Npgsql v3.2.0和Npgsql 4.0.2
在您的Context类上,在modelBuilder.HasDefaultSchema("public");
函数中添加OnModelCreating
。
例如;
public class ContextDB: DbContext
{
public DbSet<Personne> Personnes { get; set; }
public ContextDB()
: base("monDbContexte")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
base.OnModelCreating(modelBuilder);
}
}