将项目添加到通过ChangeTracker实体集合(Add items to an entity c

2019-09-28 18:34发布

我选择了把我的代码一个完整的例子,以证明什么,我正好需要的。 简单地说,我想做些什么,是让在一个通用的代码public override int SaveChanges()可以工作,以实现翻译的所有实体 ,而不是写一个接一个。

实体

public partial class EntityOne
{
    public long EntityOneId { get; set; }
    public string SomeProperty { get; set; }

    public virtual ICollection<EntityOneTranslation> EntityOneTranslations { get; set; }

    public EntityOne()
    {
        this.EntityOneTranslations = new HashSet<EntityOneTranslation>();
    }
}

public class EntityOneTranslation : EntityTranslation<long, EntityOne>
{
    public string LocalizedEntityOneProp1 { get; set; }
    public string LocalizedEntityOneProp1 { get; set; }
}

public partial class EntityTwo
{
    public long EntityTwoId { get; set; }
    public string SomeProperty { get; set; }

    public virtual ICollection<EntityTwoTranslation> EntityTwoTranslations { get; set; }

    public EntityTwo()
    {
        this.EntityTwoTranslations = new HashSet<EntityTwoTranslation>();
    }
}

public class EntityTwoTranslation : EntityTranslation<long, EntityTwo>
{
    public string LocalizedEntityTwoProp1 { get; set; }
    public string LocalizedEntityTwoProp2 { get; set; }
}

public class EntityTranslation<TEntityKey, TEntity> : ILanguage
{
    [Key, Column(Order = 0), ForeignKey("Entity")]
    public TEntityKey EntityKey { get; set; }
    [Key, Column(Order = 1), ForeignKey("Language")]
    public long LanguageId { get; set; }

    public virtual TEntity Entity { get; set; }
    public virtual Language Language { get; set; }
}

接口

public interface ILanguage
{
    long LanguageId { get; set; }
}

这里是目标

我将如何得到使用反射/或东西,以便重复使用我的代码可以工作也具有平移性质集合中的所有实体的实体导航属性?

我已经试图从其他2个帖子问同样的事情,但我没有给所有的信息。 我想这就是为什么没有人可以给我预期的答案。

在实体导航属性集合添加新条目

演员的PropertyInfo到收藏

保存更改将覆盖

public override int SaveChanges()
{
    foreach (var entityOneEntry in ChangeTracker.Entries<EntityOne>())
    {
        if (entityOneEntry.State == EntityState.Added)
        {

            //Get entity localized properties values of current language.
            var currentLanguageEntry = entityOneEntry.Entity.EntityOneTranslations.FirstOrDefault();
            var localizedEntityOneProp1 = currentLanguageEntry.LocalizedEntityOneProp1;
            var localizedEntityOneProp2 = currentLanguageEntry.LocalizedEntityOneProp2;

            //Get all languages but the current one.
            var languages = Language.Where(l => l.LanguageId != currentCulture.Key);

            //Add missing translations copying the same values.
            foreach (var language in languages)
                entityOneEntry.Entity.EntityOneTranslations.Add(new EntityOne()
                {
                    LanguageId = language.LanguageId,
                    LocalizedEntityOneProp1 = localizedEntityOneProp1,
                    LocalizedEntityOneProp2 = localizedEntityOneProp2
                });
        }
    }

    foreach (var entityOneEntry in ChangeTracker.Entries<EntityTwo>())
    {
        if (entityOneEntry.State == EntityState.Added)
        {

            //Get entity localized properties values of current language.
            var currentLanguageEntry = entityOneEntry.Entity.EntityTwoTranslations.FirstOrDefault();
            var localizedEntityTwoProp1 = currentLanguageEntry.LocalizedEntityTwoProp1;
            var localizedEntityTwoProp2 = currentLanguageEntry.LocalizedEntityTwoProp2;

            //Get all languages but the current one.
            var languages = Language.Where(l => l.LanguageId != currentCulture.Key);

            //Add missing translations copying the same values.
            foreach (var language in languages)
                entityOneEntry.Entity.EntityTwoTranslations.Add(new EntityTwo()
                {
                    LanguageId = language.LanguageId,
                    LocalizedEntityTwoProp1 = localizedEntityTwoProp1,
                    LocalizedEntityTwoProp2 = localizedEntityTwoProp2
                });
        }
    }
}
文章来源: Add items to an entity collection via ChangeTracker