Question

TranslationItem Model:

[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);               
    }
}

Translation Model:

[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");
            }
        }
    }
} 

my Seed method in my migration Configuration class

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") )
        });             
}

i get the following error when i want to update-database

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

im not quite sure how i can fix this problem. i already tried to insert my TranslationItems first, but when i do this the validation fails because there is a FK to Translations required i guess.

PLEASE HELP!!

Était-ce utile?

La solution

fixed it by my own with a little hack (not exactly my prefered solution but it works for now)

my problem: it seems that with a AddOrUpdate(...) i can only compare primitive types or enum types.

so i added an additional id called SeedId to identify my entities.

so my code in the seed method is very simple now :

foreach (EventType eventtype in PqsDbContext.getStdEventTypes())
{
    context.EventTypes.AddOrUpdate(et => et.SeedId, eventtype);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top