2012-12-05 60 views
3

一段時間以來,我一直在試圖找到一種解決方案,以便如何在遷移配置中使用種子方法,而不必擔心下次運行種子方法時更新的數據被覆蓋。實體框架遷移的條件種子

簡而言之,我的理解是addorupdate(如各種教程中所演示的)將重置每個對象的所有值,從而覆蓋該對象最初播種後可能發生的任何更改。

在我目前的項目中,我希望能夠播種一組默認的emailtemplates。將它們放入種子方法將確保它們總是出現在我的代碼中。但是,我希望應用程序的用戶能夠按照他們認爲合適的方式編輯一些內容。所以我不能很好地讓模板重置種子方法運行的所有內容,因爲它會刪除更改。

我的解決辦法是這樣的:

protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context) 
    { 
     Guid DefaultTemplateGuid = Guid.Parse("xxxxx"); 

     context.Templates.AddOrUpdate(
       t => t.Guid, 
        context.Templates.FirstOrDefault(x => x.Guid == DefaultTemplateGuid) 
        ?? new Template { 
        Guid = DefaultTemplateGuid, 
        Name = "Default Template", 
        Content = "Some Default Content" 
        } 
     ); 
    } 

這所有的一切似乎工作得很好,我的問題是,如果任何人都可以發現任何問題,做種子這種方式,因爲它是不完全的EF小組建議的方式使用這個功能,我寧願不在晚些時候頭痛。

非常感謝您的閱讀。

回答

0

通過不使用AddOrUpdate擴展方法,您可能可以節省幾次到數據庫的次數。這裏是你的代碼的簡化版本。

protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context) 
{ 
    var defaultTemplateGuid = Guid.Parse("xxxxx"); 
    var defaultTemplate = context.Templates.SingleOrDefault(
     t => t.Guid == defaultTemplateGuid); 

    if (defaultTemplate == null) 
    { 
     context.Templates.Add(
      new Template 
       { 
        Guid = defaultTemplateGuid, 
        Name = "Default Template", 
        Content = "Some Default Content" 
       }); 
    } 
}