dbo схемы npgsql не существует

у меня проблема, похожая на Entity Framework 5.0 PostgreSQL (Npgsql) по умолчанию фабрика подключений

У меня 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")
    {
    }
}

мой "Персональный" класс:

[Таблица ("personnes", Schema = "public")] открытый класс Personne {[Ключ] [Столбец ("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: le sché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: 

person Salem    schedule 25.04.2013    source источник
comment
Получилось ли у вас работать с наконечником Alamakanambra? Что касается пути c: \ projects, это путь, который разработчик Npgsql использовал для компиляции Npgsql. Вам не о чем беспокоиться.   -  person Francisco Junior    schedule 21.05.2013


Ответы (4)


Похоже, что EF использует dbo в качестве схемы по умолчанию для базы данных. Вам нужно изменить его на «общедоступный», что является схемой по умолчанию для 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

Я надеюсь, что это помогает.

person Francisco Junior    schedule 14.06.2013
comment
я уже использую эти аннотации. Самое смешное, что мое приложение работает нормально! не спрашивайте меня, откуда я не знаю: p, похоже, это исключение проходит, и когда я нахожусь в режиме отладки, я нажимаю F5 два раза, и ошибка игнорируется (спасибо, Франциско Джуниор) - person Salem; 17.06.2013
comment
Эти два исключения, которые вы получаете, связаны с запросом __MigrationHistory, который EF выполняет при запуске вашего приложения. Они игнорируются Entity Framework, но вы все равно получаете уведомление о них при отладке вашего приложения в VS.Net. Я думаю, мне все еще нужно добавить дополнительную поддержку в Npgsql, чтобы эти запросы о миграции истории работали нормально. Но пока, поскольку поддержка миграции истории не реализована в Npgsql, у этих двух ошибок нет побочных эффектов. Я рад, что у тебя все работает нормально. - person Francisco Junior; 17.06.2013
comment
спасибо @ Francisco-Junior, вы мне очень помогли, я жду следующей версии Npgsql - person Salem; 18.06.2013
comment
но с mysql это работает, этот dbo. проблема может быть связана с драйвером postgres - person jairhumberto; 04.12.2019

Я использовал 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);
    }
}
person ahmeticat    schedule 06.03.2019

У меня была такая же проблема. Не знаю почему, но когда я не использовал Database.SetInitializer в Application_Start() методе, это было нормально. Так:

//Database.SetInitializer<ContextDB>(new ContextDBInitializer());
person Alamakanambra    schedule 30.04.2013
comment
На самом деле я не использую эту строку. НО, когда я продолжаю отладку (F5 два раза), VS, похоже, игнорирует это исключение и правильно запускает код. ЧУДО! (Thans Alamakanambra & Francisco Junior) - person Salem; 01.06.2013

Мое решение:

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

Это может быть несовершенно, но это работает.

person Maxim Eliseev    schedule 04.09.2013