AlterProcedureException when I try update-database command EF6 MYSQL

时间:2016-02-12 21:38:05

标签: mysql entity-framework ef-migrations

I'm trying to alter a table in Entity Framework 6 with mysql connectors.

The error is:

GaussianNB()

My context is:

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

My package.config file is:

    [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());

        }

And example file of add-migration is:

<?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>

I can create a database with commands, and add a new table, but I can't modify a column of a table (drop column or add column). The problem isn't drop, it's 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`=@IdController, `Name`=@Name 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."); } } method.

1 个答案:

答案 0 :(得分:0)

您的例外是:&#34; System.NotImplementedException:AlterProcedureOperation&#34;

那是我found

  

查看存储例程的手册页...

     

&#34; ALTER程序| FUNCTION只能修改特征和   存储过程或函数的注释。但是,你无法改变   使用此语句的存储过程的参数或主体;至   进行此类更改时,必须删除并重新创建该过程   DROP程序和创建程序。&#34;

因此,请尝试将迁移更改为 DROP并创建而不是ALTER