2009-07-01 3 views
0

私はマイグレーションを多く使用します(MySQLのみ).SubSonicの移行ではCreateForeignKeyで親カラムとマスターカラムを定義することしかできません。 FKの関係。SubSonic 2 Migrations Addon:MySQL固有のForeignKeyの移行手順を作成

しかし、親レコードを削除すると、子テーブルのすべてのレコードをnullに設定する必要があるFK関係を定義する必要があります(デフォルトは制限することになります)削除)。

私にはこれを行う小さな機能を使用します。 しかし、これは完全にMySQL固有のものであり、(DBに依存しないように)動作の移行を意味するアイデアを破るので、私はこれに対してパッチを提供しないことにしました。だから私はここにコードスニペットを投稿する。

しかし、誰かがこれを必要とする場合もあります。それを自由に使用してください。
ただ1つの欠点があります。sonic.exeはコードファイルを読み取り、それを即座に遵守するため、コードを使用するすべての移行にコードを貼り付ける必要があります。

答えて

0

ここでは、これを使用するサンプルの移行について説明します。 downメソッドでは、既存の "DropForeignKey(...)"メソッドを使用することができます。

using System; 
using System.Collections.Generic; 
using System.Text; 
using SubSonic; 

namespace MyNameSpace.Migrations 
{ 

    public class Migration001 : Migration 
    { 

     public override void Up() 
     { 
      TableSchema.Table parent = GetTable("parent"); 
      TableSchema.Table child = GetTable("child"); 

      CreateForeignKeyMySQL(parent.GetColumn("id"), child.GetColumn("parent_id"), 
       CreateForeignKeyAction.SetNull, CreateForeignKeyAction.Restrict); 

      base.Up(); 
     } 

     public override void Down() 
     { 
      DropForeignKey(parent.GetColumn("id"), child.GetColumn("parent_id")); 

      base.Down(); 
     } 

     #region foreign key helper function 

     public enum CreateForeignKeyAction 
     { 
      Cascade, 
      Restrict, 
      SetNull, 
      NoAction 
     } 

     private String CreateForeignKeyActionValue(CreateForeignKeyAction action) 
     { 
      switch (action) 
      { 
       case CreateForeignKeyAction.Cascade: 
        return "CASCADE"; 
       case CreateForeignKeyAction.Restrict: 
        return "RESTRICT"; 
       case CreateForeignKeyAction.SetNull: 
        return "SET NULL"; 
       case CreateForeignKeyAction.NoAction: 
        return "NO ACTION"; 
       default: 
        return "CASCADE"; 
      } 
     } 

     public void CreateForeignKeyMySQL(
      TableSchema.TableColumn oneTable, TableSchema.TableColumn manyTable, 
      CreateForeignKeyAction onDelete, CreateForeignKeyAction onUpdate) 
     { 

      String sqlAppend = String.Format(" ON DELETE {0} ON UPDATE {1}", 
       CreateForeignKeyActionValue(onDelete), CreateForeignKeyActionValue(onUpdate)); 

      SubSonic.MySqlGenerator generator = new SubSonic.MySqlGenerator(null); 
      String sqlCommand = 
       System.Text.RegularExpressions.Regex.Replace(
        generator.BuildForeignKeyStatement(oneTable, manyTable), ";?$", sqlAppend 
       ); 

      Execute(sqlCommand); 
     } 

     #endregion 

    } 

} 
関連する問題