2009-07-01 50 views
0

我使用遷移很多(只有MySQL),並且因爲SubSonic Migrations只允許在CreateForeignKey中定義父列和主列,所以我無法在一個列表中定義更新/刪除操作FK關係。SubSonic 2 Migrations插件:創建一個特定於MySQL的ForeignKey遷移步驟

但是,在我需要定義一個FK關係的情況下,如果我刪除父記錄,子表中的所有記錄都應該設置爲空(默認情況下是限制刪除)。

我使用一個小功能,爲我做這個。 但是,由於這完全是MySQL特有的,它打破了站立行爲遷移(獨立於數據庫)的思想,因此我決定不爲此提供補丁。所以我在這裏發佈代碼片段。

但是如果有人也需要這個。隨意使用它。
只有一個缺點:由於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 

    } 

} 
相關問題