2016-02-12 48 views
5

我試圖改變實體框架6與MySQL連接器中的表。AlterProcedureException當我嘗試更新數據庫命令EF6 MYSQL

的錯誤是:

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 

我的背景是:

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

     } 

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

而且例如附加遷移的文件是:

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."); 
     } 
    } 

我可以用命令創建一個數據庫,並添加一個新表,但是我無法修改表的列(刪除列或添加列)。問題不是下降,它是AlterStoredProcedure方法。

回答

0

您的例外是: 「System.NotImplementedException:AlterProcedureOperation」

,這就是我爲found

退房存儲例程的手冊頁...

「ALTER PROCEDURE | FUNCTION只能修改存儲過程或函數的特徵和註釋,但不能使用此語句更改存儲過程的參數或主體; 進行了此類更改,則必須使用 DROP PROCEDURE和CREATE PROCEDURE刪除並重新創建該過程。「

所以儘量遷移更改爲DROP和CREATE,而不是ALTER