EF миграция семян - невозможно создать постоянное значение типа 'Application.Model.TranslationItem'
Модель 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");
}
}
}
}
мой метод Seed в моем классе конфигурации миграции
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(...)
я могу сравнивать только примитивные типы или типы перечислений.
поэтому я добавил дополнительный идентификатор под названием SeedId
идентифицировать мои сущности.
поэтому мой код в методе seed теперь очень прост:
foreach (EventType eventtype in PqsDbContext.getStdEventTypes())
{
context.EventTypes.AddOrUpdate(et => et.SeedId, eventtype);
}