2016-02-12 11 views
5

Sto provando ad alterare una tabella in Entity Framework 6 con i connettori mysql.AlterProcedureException quando provo il comando update-database EF6 MYSQL

L'errore è:

PM> update-database -verbose 
Using StartUp project 'Facade'. 
Using NuGet project 'DAL'. 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
Target database is: 'GiveAndGet' (DataSource: localhost, Provider: MySql.Data.MySqlClient, Origin: Configuration). 
Applying explicit migrations: [201602122108206_2]. 
Applying explicit migration: 201602122108206_2. 
System.NotImplementedException: AlterProcedureOperation 
    en MySql.Data.Entity.MySqlMigrationSqlGenerator.Generate(IEnumerable`1 migrationOperations, String providerManifestToken) 
    en System.Data.Entity.Migrations.DbMigrator.GenerateStatements(IList`1 operations, String migrationId) 
    en System.Data.Entity.Migrations.Infrastructure.MigratorBase.GenerateStatements(IList`1 operations, String migrationId) 
    en System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, VersionedModel targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto) 
    en System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    en System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) 
    en System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    en System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId) 
    en System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration) 
    en System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b() 
    en System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    en System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    en System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
    en System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 
    en System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run() 
    en System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    en System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) 
    en System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 
    en System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force) 
    en System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0() 
    en System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) 
AlterProcedureOperation 

mio contesto è:

[DbConfigurationType(typeof(MySqlEFConfiguration))] 
    public class GiveAndGetContext : DbContext 
    { 

     public GiveAndGetContext() 
     : base("GiveAndGetContext") 
     { 
      //Database.SetInitializer(
      //  new MigrateDatabaseToLatestVersion<GiveAndGetContext, DAL.Migrations.Configuration>("GiveAndGetContext")); 

     } 


     //Para crear des de presentation 
     // // Constructor to use on a DbConnection that is already opened 
     // public GiveAndGetContext(DbConnection existingConnection, bool contextOwnsConnection) 
     //: base(existingConnection, contextOwnsConnection) 
     // { 

     // } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Entity<Category>().MapToStoredProcedures(); 
      modelBuilder.Entity<City>().MapToStoredProcedures(); 
      modelBuilder.Entity<Controller>().MapToStoredProcedures(); 
      modelBuilder.Entity<Country>().MapToStoredProcedures(); 
      modelBuilder.Entity<Interest>().MapToStoredProcedures(); 
      modelBuilder.Entity<Item>().MapToStoredProcedures(); 
      modelBuilder.Entity<Language>().MapToStoredProcedures(); 
      modelBuilder.Entity<Literal>().MapToStoredProcedures(); 
      modelBuilder.Entity<Province>().MapToStoredProcedures(); 
      modelBuilder.Entity<Region>().MapToStoredProcedures(); 
      modelBuilder.Entity<User>().MapToStoredProcedures(); 
      modelBuilder.Entity<View>().MapToStoredProcedures(); 
      modelBuilder.Entity<prueba>().MapToStoredProcedures(); 
     } 
} 
} 

Configuration file of migrations is: 

internal sealed class Configuration : DbMigrationsConfiguration<DAL.Context.GiveAndGetContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 

      SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); 

     } 

Il mio file package.config è:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="EntityFramework" version="6.1.3" targetFramework="net46" /> 
    <package id="MySql.Data" version="6.9.8" targetFramework="net46" /> 
    <package id="MySql.Data.Entity" version="6.9.8" targetFramework="net46" /> 
</packages> 

E l'esempio di file di add-migrazione è:

using System; 
    using System.Data.Entity.Migrations; 

    public partial class _2 : DbMigration 
    { 
     public override void Up() 
     { 
      AlterColumn("dbo.pruebas", "Name", c => c.Short(nullable: false)); 
      AlterStoredProcedure(
       "dbo.prueba_Insert", 
       p => new 
        { 
         IdController = p.Short(), 
         Name = p.Short(), 
        }, 
       body: 
        @"SET SESSION sql_mode='ANSI';INSERT INTO `pruebas`(
         `IdController`, 
         `Name`) VALUES (
         @IdController, 
         @Name); 
         SELECT 
         `Id` 
         FROM `pruebas` 
         WHERE row_count() > 0 AND `Id`=last_insert_id();" 
      ); 

      AlterStoredProcedure(
       "dbo.prueba_Update", 
       p => new 
        { 
         Id = p.Short(), 
         IdController = p.Short(), 
         Name = p.Short(), 
        }, 
       body: 
        @"UPDATE `pruebas` SET `IdController`[email protected], `Name`[email protected] WHERE `Id` = @Id;" 
      ); 

     } 

     public override void Down() 
     { 
      AlterColumn("dbo.pruebas", "Name", c => c.String(unicode: false)); 
      throw new NotSupportedException("Scaffolding create or alter procedure operations is not supported in down methods."); 
     } 
    } 

Posso creare un database con i comandi e aggiungere una nuova tabella, ma non posso modificare una colonna di una tabella (trascina colonna o aggiungi colonna). Il problema non è la caduta, è il metodo AlterStoredProcedure.

risposta

0

tuo eccezione è: "System.NotImplementedException: AlterProcedureOperation"

E questo è ero found:

Partenza la pagina di manuale per le procedure memorizzate ...

"ALTER PROCEDURE | FUNCTION può modificare solo la caratteristica e il commento di una stored procedure o funzione.Tuttavia, non è possibile modificare i parametri o il corpo di una stored procedure utilizzando questa istruzione; a apportare tali modifiche, è necessario eliminare e ricreare la procedura utilizzando PROCEDURA DROP e CREATE PROCEDURE. "

Quindi, cercare di cambiare la migrazione a DROP e CREATE invece di ALTER