2013-01-15 28 views
1

TranslationItem型號:EF遷移種子 - 無法創建類型的恆定值 'Application.Model.TranslationItem'

[DataContract] 
public class TranslationItem : CloneableBaseEntity<TranslationItem>, IValidatableObject 
{ 

    public int TranslationId { get; set; } 
    public Translation Translation { get; set; } 

    public int Lcid { get; set; }   

    private string _text; 
    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      _text = value; 
      RaisePropertyChanged("Text"); 
     } 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var t = validationContext.ObjectInstance as TranslationItem; 
     return t.Translation.Validate(validationContext);    
    } 
} 

翻譯模式:

[DataContract] 
public class Translation : CloneableBaseEntity<Translation>, IValidatableObject 
{ 
    private static int _englishLcid = 9; 

    private ObservableCollection<TranslationItem> _translations; 
    [DataMember] 
    public virtual ObservableCollection<TranslationItem> Translations 
    { 
     get{ 
      return _translations; 
     } 
     set 
     { 
      _translations = value; 
      foreach (TranslationItem ti in _translations) 
      { 
       ti.PropertyChanged += ti_PropertyChanged; 
      } 
     } 
    } 

    ... 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){ 

     Translation t; 
     if(validationContext.ObjectInstance.GetType()== typeof(Translation)) 
      t = validationContext.ObjectInstance as Translation; 
     else 
      t =(validationContext.ObjectInstance as TranslationItem).Translation; 

     if (!t.EnglishNotRequried) 
     { 
      if (!t.TranslationDict.ContainsKey(_englishLcid) || String.IsNullOrEmpty(t.TranslationDict[_englishLcid].Text)) 
      { 
       yield return new ValidationResult("EnglishTranslationMissing"); 
      } 
     } 
    } 
} 

我在我的遷移Configuration類種子方法

protected override void Seed(DbContext context) 
{ 
    int deLcid = new CultureInfo("en").LCID; 
    int enLcid = new CultureInfo("en").LCID; 


    TranslationItem enStd = context.TranslationItems.FirstOrDefault(ti => ti.Text == "Standard" && ti.Lcid == enLcid) 
          ?? new TranslationItem { Text = "Standard", Lcid = enLcid }; 

    TranslationItem deStd = context.TranslationItems.FirstOrDefault(ti => ti.Text == "Standard" && ti.Lcid == deLcid) 
          ?? new TranslationItem { Text = "Standard", Lcid = deLcid }; 

    context.Translations.AddOrUpdate(
     t => t.Translations, 
     new Translation 
      { 
       Translations = new ObservableCollection<TranslationItem> 
        { 
         enStd, 
         deStd 
        } 
      }); 

    context.SaveChanges(); 

    context.EventTypes.AddOrUpdate(
     et => et.Name, 
     new EventType 
     { 
      Name = context.Translations.FirstOrDefault(t => t.Translations.Any(x => x.Lcid == enLcid && x.Text == "Standard") && 
                  t.Translations.Any(x => x.Lcid == deLcid && x.Text == "Standard")) 
     });    
} 

我收到以下錯誤,當我想更新數據庫

Unable to create a constant value of type 'PQS.Model.TranslationItem'. Only primitive types or enumeration types are supported in this context. 

我不太清楚我該如何解決這個問題。 我已經嘗試先插入我的TranslationItems,但是當我這樣做時,驗證失敗,因爲有一個FK到翻譯需要我猜。

請幫助!

回答

1

修好了我自己的一個小黑客(不完全是我的首選解決方案,但它的工作原理現在)

我的問題:似乎有AddOrUpdate(...)我只能比較原始類型或enum類型。

所以我添加了一個名爲SeedId的ID來識別我的實體。

所以我在種方法的代碼現在是非常簡單的:

foreach (EventType eventtype in PqsDbContext.getStdEventTypes()) 
{ 
    context.EventTypes.AddOrUpdate(et => et.SeedId, eventtype); 
} 
相關問題