用于更新抽象对象集合中对象的简洁方法

时间:2017-09-29 10:36:31

标签: asp.net entity-framework collections abstract

当我在我的模型中使用本地化对象开发asp net core + ef core 2.0时,我调整了以下链接中提供的解决方案来本地化我的对象link

我现在正试图在控制器中收到更新的对象时,找到一种更新我的翻译集合的简洁方法。

目前我有一个以这种方式定义的步模型类:

public class Step
    {
        //Native properties
        public Guid ID { get; set; }
        public string Name { get; set; }
        public int Order { get; set; }
        public string ScriptBlock { get; set; }

        //Parent Step Navigation property
        public Nullable<Guid> ParentStepID { get; set; }
        public virtual Step ParentStep { get; set; }

        //Collection of sub steps
        public virtual ICollection<Step> SubSteps { get; set; }

        //MUI Properties
        public TranslationCollection<StepTranslation> Translations { get; set; }

        public string Description { get; set; }
        //{
        //    get { return Translations[CultureInfo.CurrentCulture].Description; }
        //    set { Translations[CultureInfo.CurrentCulture].Description = value; }
        //}

        public Step()
        {
            //ID = Guid.NewGuid();
            Translations = new TranslationCollection<StepTranslation>();
        }
    }

    public class StepTranslation : Translation<StepTranslation>
    {

        public Guid StepTranslationId { get; set; }

        public string Description { get; set; }

        public StepTranslation()
        {
            StepTranslationId = Guid.NewGuid();
        }

    }

翻译和翻译收集与链接中的相同

public class TranslationCollection<T> : Collection<T> where T : Translation<T>, new()
{

    public T this[CultureInfo culture]
    {
        // indexer
    }

    public T this[string culture]
    {
        //indexer
    }

    public bool HasCulture(string culture)
    {
        return this.Any(x => x.CultureName == culture);
    }

    public bool HasCulture(CultureInfo culture)
    {
        return this.Any(x => x.CultureName == culture.Name);
    }
 }

public abstract class Translation<T> where T : Translation<T>, new()
{

    public Guid Id { get; set; }

    public string CultureName { get; set; }

    protected Translation()
    {
        Id = Guid.NewGuid();
    }

    public bool HasProperty(string name)
    {
        return this.GetType()
            .GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Any(p => p.Name == name);
    }

}

本示例中的问题是如何正确处理PUT方法和步进控制器的Description属性。当它收到要更新的Step对象(通过本机c#客户端完成)时,可能只创建/更新/未更改Step的字符串Description属性。所以我必须在正确的文化中更新/创建/做任何关于翻译的描述。

我的第一个猜测是在TranslationCollection类中添加一个方法,在该方法中我可以传递文化,要更新或不更新的属性的名称(在这种情况下为描述)和描述的值。

但是因为TranslationCollection是抽象对象的集合,所以即使这是一个好主意也是如此,如果可能的话。

如果有人会对此有任何建议(希望我足够清楚),那就太棒了!

1 个答案:

答案 0 :(得分:0)

最后回答了我自己的问题,这很简单。

只需使用索引器就像:     myobject.Translations [userLang] .Name = value;