2012-11-14 83 views
4

在我們的項目中成功處理實體框架遷移。 但現在我遇到了一個特殊情況,我需要更新一個需要某些業務邏輯的表(位於我們的應用程序中作爲C#代碼)。所以我嘗試在遷移Up方法中產生一個線程,並使用業務邏輯執行此表更新。 此表更新對於應用程序執行不是必需的,應該在後臺進行。在EF遷移中自定義代碼執行

我有點這樣做是這樣的:

public partial class MyMigration : DbMigration 
{ 
    public override void Up() 
    { 
    // ... do some sql migration here ... 

    // after executing the sql migrations custommethod should run 
    // migration seems to wait until CustomMethod finished work 
    new Thread(() => ExecuteCustomMethodDatabaseContext()).Start(); 
    } 
} 

我期望啓動線程和EF設置在MigrationHistory的遷移完成後Up方法返回。因此,應用程序可以啓動,並在桌面的某個地方進行更新。

但並非如此,遷移似乎在線程運行時運行(這需要很多時間)。

所以我按照問題:

  1. 是它在總體上是好的做法 DBmigrations執行自定義代碼?
  2. 如果不是,我如何在我的 的情況下完成自定義代碼執行的需要? (不用重寫存儲過程中的業務邏輯或 )
  3. 如果是,我在做什麼錯?我如何在遷移過程中執行此代碼並且不會阻止它?
+0

爲什麼它必須與遷移集成?你不能在你的應用程序的啓動過程中的某個地方進行異步操作嗎? – jeroenh

+1

導致在最新的sql遷移(更新代碼塊)之後只執行一次而不是每次應用程序啓動時都需要執行。 – dasheddot

回答

2

DbMigration上的Up和Down方法只是構建了一個內存模型,後來被轉換爲SQL。執行定製邏輯有兩種選擇:

  1. 使用Sql方法使用T-SQL在數據庫服務器上執行邏輯。
  2. 在您的migrations配置類的Seed方法(通常爲Migrations \ Configuration.cs)中執行邏輯。在更新數據庫過程中應用了所有遷移後,調用此方法
+1

種子方法看起來很有希望,因爲它不完全是我想要的。在我的理解中,Seed方法在EVERY遷移後運行。但是我希望這個代碼只在運行特殊遷移時運行一次。如果稍後添加其他遷移,並且特殊遷移已經遷移,我不希望自定義代碼再次運行。有沒有辦法在Seed方法中做到這一點? – dasheddot

+0

@dasheddot你的定製邏輯是做什麼的?如果它創建數據庫工件,則可以在運行之前檢查它們是否存在。 – bricelam

+0

我正在嘗試用業務邏輯構建的數據填充表。檢查數據是否已經刷新會很棘手。但無論如何這是一個很好的提示 – dasheddot