Visual Studio 2013上的postgresql和ef6代码优先迁移错误

时间:2016-06-22 14:19:41

标签: postgresql ef-code-first entity-framework-6 npgsql ef-migrations

我创建了一个类库并通过nugget

安装了npgsql ef6
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="EntityFramework6.Npgsql" version="3.1.0" targetFramework="net45" />
  <package id="Npgsql" version="3.1.0" targetFramework="net45" />
  <package id="Npgsql.EF6" version="2.0.12-pre4" targetFramework="net45" />
</packages>

我已经添加了数据类和上下文类,如下所示

public class MatterContext : DbContext
    {
        public MatterContext() : base(nameOrConnectionString: "connString") { }

        public DbSet<User> Users { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.HasDefaultSchema("public");
            base.OnModelCreating(modelBuilder);
        }
    }
[Table("users", Schema="public")]
    public class User
    {
        [Key]
        [Column("id")]
        public int Id { get; set; }
        [Column("name")]
        public string Name { get; set; }
        [Column("created_on")]
        public DateTime CreatedOn { get; set; }
        [Column("created_by")]
        public User CreatedBy { get; set; }
    }

我的App.config看起来像

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <system.data>
    <DbProviderFactories>
      <!--<remove invariant="Npgsql" />-->
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="connString" connectionString="server=127.0.0.1;port=3501;user id=devUser;password=devPass;database=urm" providerName="Npgsql" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, EntityFramework6.Npgsql" />
    <providers>
      <!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
    </providers>
  </entityFramework>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.12.0" newVersion="2.0.12.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我还启用了迁移并添加了初始迁移文件。我是配置文件。

当我尝试以详细模式更新数据库时,我在控制台

下面得到错误输出
Using StartUp project 'Test.ConsoleApp'.
Using NuGet project 'Database.Gravity'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
**Target database is: 'connString' (DataSource: .\SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Convention).**
Applying explicit migrations: [201606211302325_Initial].
Applying explicit migration: 201606211302325_Initial.
**IF schema_id('public') IS NULL
    EXECUTE('CREATE SCHEMA [public]')**
System.Data.SqlClient.SqlException (0x80131904): **There is already an object named 'public' in the database.**
CREATE SCHEMA failed due to previous errors.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   ...
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:3d5f2fde-c99b-4e8d-aade-e6fe24f670e3
Error Number:2714,State:6,Class:16
**There is already an object named 'public' in the database.
CREATE SCHEMA failed due to previous errors.**

从这一点来说,我将有3个问题:

  1. 为什么目标数据库为&#34; connString&#34;是&#34;。\ SQLEXPRESS&#34;?
  2. 为什么输出脚本是针对mssql的? IF schema_id(&#39; public&#39;)是空的 执行(&#39;创建计划[公共]&#39;
  3. 这就是我收到错误的原因吗?
  4.   

    已经有一个名为&#39; public&#39;在数据库中。

    我的PostgreSQL版本是9.5

0 个答案:

没有答案