2013-04-25 79 views
4

我有类似Entity Framework 5.0 PostgreSQL (Npgsql) default connection factory架构Npgsql的 “DBO” 不存在

一个问题,我已经在Npgsql的声明的app.config:

<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”)] public class Personne {Key] [Column(“id_personne”)] [Display(Name =“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

我不undersand什么是错在这

编辑:

这是个例外:
(抱歉,但它是在法国)

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

你得到它与Alamakanambra小费工作?关于c:\ projects路径,这是Npgsql开发人员用于编译Npgsql的路径。你不需要担心它。 – 2013-05-21 18:35:04

回答

0

我有同样的问题。 不知道为什么,但是当我没有在Application_Start()方法中使用Database.SetInitializer这就好了。 所以:

//Database.SetInitializer<ContextDB>(new ContextDBInitializer()); 
+0

我真的不使用这条线。但是当我继续调试(F5两次)VS似乎忽略此异常正确运行代码。 BIZAR! (thans Alamakanambra&Francisco Junior) – Salem 2013-06-01 08:57:19

3

看来EF采用DBO作为数据库的默认模式。您需要将其更改为Postgresql的默认模式“public”。

您使用的是通过导入命名空间:

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

我希望它有帮助。

+0

am已经在使用这个注解。有趣的是我的应用程序runnig罚款!不要问我怎么不知道:p,它似乎通过这个异常,当我在调试模式下,我按F5两次,错误被忽略(感谢Francisco Junior) – Salem 2013-06-17 07:55:48

+1

你得到的那2个异常是关于__MigrationHistory查询EF在启动应用程序时执行。它们被实体框架忽略,但在VS.Net中调试应用程序时仍然收到有关它们的通知。我认为我仍然需要在Npgsql中添加更多支持,以便有关历史迁移的查询可以正常工作。但是,因为历史迁移支持在Npgsql中没有实现,所以对这两个错误没有副作用。我很高兴你能让它工作正常。 – 2013-06-17 16:05:59

+0

感谢@ Francisco-Junior你帮了我很多,我正在等待Npgsql的下一个版本 – Salem 2013-06-18 07:27:26

0

我的解决办法:

public class PostgisDbContext : DbContext 
{ 
    public PostgisDbContext() : base("Postgis") 
    { 
     //begin 
     try 
     { 
      this.Database.Initialize(false); issue 
     } 
     catch (Exception) 
     {} 
     //end 
    } 
} 

这可能是不完美的,但它的工作原理。