通过ChangeTracker

时间:2017-10-05 21:38:09

标签: c# entity-framework reflection navigation-properties

我选择了一个完整的代码示例,以展示我确切需要的内容。简而言之,我想做的是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个帖子中提出同样的问题,但我没有提供所有信息。我猜这就是为什么没有人能给我预期的答案。

Adding new entries over entity navigation property collection

Cast PropertyInfo to Collection

保留更改

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

0 个答案:

没有答案