FirebirdSQL / NETProvider

Firebird ADO.NET Data Provider
https://www.firebirdsql.org/en/net-provider/
Other
160 stars 66 forks source link

Migration Problem [DNET801] #738

Closed firebird-automations closed 2 years ago

firebird-automations commented 6 years ago

Submitted by: Andreas Patock (apatock)

Hi Jiri, you wanted to post me this to the issue tracker - here it is.

I have a problem add a new column via migration to a codefirst database.

This is the code for the migration:

public partial class StreamingModuleAddAddress2 : DbMigration
\{
    public override void Up\(\)
    \{
        AddColumn\("dbo\.StreamingModule", "Address1", c =\> c\.String\(nullable: false, maxLength: 23\)\);
        AddColumn\("dbo\.StreamingModule", "Address2", c =\> c\.String\(nullable: false, maxLength: 23\)\);
        AddColumn\("dbo\.StreamingModule", "Port1", c =\> c\.Int\(nullable: false\)\);
        AddColumn\("dbo\.StreamingModule", "Port2", c =\> c\.Int\(nullable: false\)\);
        DropColumn\("dbo\.StreamingModule", "Address"\);
        DropColumn\("dbo\.StreamingModule", "Port"\);
    \}

    public override void Down\(\)
    \{
        AddColumn\("dbo\.StreamingModule", "Port", c =\> c\.Int\(nullable: false\)\);
        AddColumn\("dbo\.StreamingModule", "Address", c =\> c\.String\(nullable: false, maxLength: 23\)\);
        DropColumn\("dbo\.StreamingModule", "Port2"\);
        DropColumn\("dbo\.StreamingModule", "Port1"\);
        DropColumn\("dbo\.StreamingModule", "Address2"\);
        DropColumn\("dbo\.StreamingModule", "Address1"\);
    \}
\}

But when running entityframework creates the following sql:

ALTER TABLE "StreamingModule" ADD "Address1" VARCHAR(23) DEFAULT CAST(_UTF8'' AS VARCHAR(0)) NOT NULL

I think firebird doesn't allow the CAST in a DEFAULT statement!

And this causes the following exception:

FirebirdSql.Data.FirebirdClient.FbException was unhandled ErrorCode=335544569 HResult=-2147467259 Message=Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 66 CAST SQLSTATE=42000 Source=FirebirdSql.Data.FirebirdClient StackTrace: bei FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteNonQuery() bei System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c) bei System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) bei System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) bei System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() bei System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection) bei System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e() bei System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction) bei System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements) bei System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto) bei System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) bei System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) bei System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) bei System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() bei System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) bei System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) bei System.Data.Entity.MigrateDatabaseToLatestVersion`2.InitializeDatabase(TContext context) bei System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e() bei System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) bei System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() bei System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) bei System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) bei System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) bei System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() bei System.Data.Entity.Internal.Linq.InternalSet`1.GetEnumerator() bei System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() bei System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) bei System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) bei ConsoleTester.Program.Main(String[] args) in C:\WorkDir_Trunk\Win\Bfe\KscSilknet\Database\ConsoleTester\Program.cs:Zeile 22. bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart() InnerException: ErrorCode=335544569 HResult=-2146233088 IsWarning=false Message=Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 66 CAST SQLSTATE=42000 Source=FirebirdSql.Data.FirebirdClient StackTrace: bei FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.ProcessResponse(IResponse response) bei FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.ReadResponse() bei FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.ReadGenericResponse() bei FirebirdSql.Data.Client.Managed.Version11.GdsStatement.Prepare(String commandText) bei FirebirdSql.Data.FirebirdClient.FbCommand.Prepare(Boolean returnsSet) bei FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior behavior, Boolean returnsSet) bei FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteNonQuery() InnerException:

Do you have any Idea how to fix that?

Kind regards, Andreas

cincuranet commented 2 years ago

EF6 provider here is in maintenance/legacy mode here (see https://groups.google.com/g/firebird-net-provider/c/_0Hwoh5XG_I). If somebody feels like tackling this with good PR, it will be reopened.