2011-04-01 49 views
0

我有一個非常奇怪的問題與SubSonic當我編輯一個類的數據庫不更新,即使我刪除它並重新生成它。SubSonic編輯類問題

舉例:簡易類

public class Customer { 
    public Guid Id { get; set; } 
    public string Description { get; set; } 
} 

Customer c = new Customer() { Id = Guid.NewGuid(), Description = "Toaster" }; 

var repo = new SimpleRepository("CustomerTest", 
    SimpleRepositoryOptions.RunMigrations); 
repo.Add(c); 

如果我運行此代碼它完美的作品,創建表「客戶」並插入該行的烤麪包機。但是,如果我決定我的客戶類更改爲:

public class Customer { 
    public Guid Id { get; set; } 
    public string Description { get; set; } 
    public int Cost { get; set;} 
} 

並運行相同的代碼,增加對成本屬性的值的數據庫表保持「標識,說明」。如果我在Customer字段中創建一個全新的類並且過去,它將在第一次正確創建表時,所有更改都不會顯示工作。

任何幫助?

回答

0
  • 首先,你應該試着弄清楚亞音速是否能夠正確檢測你的類定義的變化。
    這段代碼應該給你一個亞音速想要執行的語句的概述。

    var migrator=new SubSonic.Schema.Migrator(Assembly.GetExecutingAssembly()); 
    var provider=ProviderFactory.GetProvider("CustomerTest"); 
    string[] commands=migrator.MigrateFromModel<Customer>(provider); 
    

    命令應包含subsonic想要對數據庫進行的所有更改。 你可以自己執行這些命令: BatchQuery query = new BatchQuery(provider); foreach(var in command) query.QueueForTransaction(new QueryCommand(s.Trim(),provider));

    //pop the transaction 
    query.ExecuteTransaction(); 
    

    (代碼取自http://subsonicproject.com/docs/3.0_Migrations)。
    這就是說,我想你的情況下命令將是空的。 在這種情況下,可能是由您正在使用的提供程序(SqlServer/MySQL/SQLite/Oracle)未實現的語句導致的。也許你應該下載SubSonic源代碼並進入migrator.MigrateFromModel(...)方法來查看會發生什麼。

  • 另一個可能的原因(如果您使用MySQL)可能是您的信息架構不是最新的。前一段時間我遇到過這個問題。在更改我的數據庫並使用SubSonic 2重新生成DAL後,我生成的代碼沒有改變。
    我發現mysql信息模式(以及subsonic對信息模式的查詢)還沒有改變。 我通過執行FLUSH TABLES解決了這個問題,導致信息方案重新加載。我不知道這是否是mysql中的錯誤或期望的行爲,但您應該先嚐試FLUSH TABLES。