Я боюсь, что это невозможно. Вам нужно будет выполнить довольно сложный поиск рефракции, чтобы найти все типы со свойством с типом ICollection <ITranslation>. Я предлагаю вам пойти по более короткому пути и определить ITranslationContainer или ITranshable, как я указал в своем комментарии, и заставить FileType и ElementType реализовать его. Тогда просто пройдите все ChangeTracker.Entries <ITranshable>

ужно создать общий способ добавления пропущенных языков записей ко всем сущностям, в которых реализуется определенный интерфейс. Я узнал, как получить мою коллекционную собственность, но я все еще не знаюкак добавить новые значения на него раньше приступить к сохранению.

После кусочка моегоpublic override int SaveChanges() обработки.

foreach (var translationEntity in ChangeTracker.Entries(<ITranslation>))
{
    if (translationEntity.State == EntityState.Added)
    {
        var translationEntries = translationEntity.Entity.GetType()
                                .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                                .Where(x => x.CanWrite &&
                                x.GetGetMethod().IsVirtual &&
                                x.PropertyType.IsGenericType == true &&
                                typeof(IEnumerable<ILanguage>).IsAssignableFrom(x.PropertyType) == true);

        foreach (var translationEntry in translationEntries)
        {
            //Add missing items.
        }
    }
}

Классы примеров кода

public partial class FileType : ITranslation
{
    public long FileTypeId { get; set; }
    public string AcceptType { get; set; }

    public virtual ICollection<FileTypeTranslation> FileTypeTranslations { get; set; }

    public FileType()
    {
        this.FileTypeTranslations = new HashSet<FileTypeTranslation>();
    }
}

public class FileTypeTranslation : EntityTranslation<long, FileType>, ILanguage
{
    [Required]
    public string TypeName { get; set; }
}


public partial class ElementType : ITranslation
{
    public long ElementTypeId { get; set; }
    public string Code { get; set; }

    public virtual ICollection<ElementTypeTranslation> ElementTypeTranslations { get; set; }

    public ElementType()
    {
        this.ElementTypeTranslations = new HashSet<FileTypeTranslation>();
    }
}

public class ElementTypeTranslation : EntityTranslation<long, ElementType>, ILanguage
{
    [Required]
    public string Description { get; set; }
}
 Krzysztof Skowronek04 окт. 2017 г., 17:13
Хорошо, но что не работает в коде выше? Я понимаю, что вы вызываете base.SaveCahnges как последнюю вещь в вашем методе переопределения, поэтому он должен делать то, что вы хотите. Является ли эта коллекция частью интерфейса ITranslation? Или это коллекция объектов ITranslation?
 Krzysztof Skowronek04 окт. 2017 г., 17:03
Не могли бы вы рассказать больше? Что не работает? как выглядит код добавления новых объектов перевода?
 Rubens Mussi Cury04 окт. 2017 г., 17:27
Приведенный выше код просто возвращает свойство коллекции, ноЯ не могу изменить его, добавив или удалив что-либо - у меня нет этих методов, Я также пытался использоватьtranslationEntity.Collection("MyCollectionName"); но у меня также нет методов добавления или удаления. Нет, коллекция не является частью ITranslation.
 Rubens Mussi Cury04 окт. 2017 г., 17:07
@KrzysztofSkowronek просто представьте, что у вас есть Модель с некоторым свойством коллекции и вы хотите изменить эту коллекцию из своего ChangeTracker. Пожалуйста, также учтите, что эта коллекция имеет известную структуру.
 Krzysztof Skowronek04 окт. 2017 г., 17:45
тогда вы должны получить все записи, которые имеют переводы propety и изменить их коллекции. Метод в вашем коде просто получает все добавленные переводы. Вы должны найти всех родителей

Ответы на вопрос(1)

которое содержит исходную сущность

foreach (var fileType in ChangeTracker.Entries(<FileType>))
{
  fileType.Entity.FileTypeTranslations.Add();
}

и для ElementType:

foreach (var elementType in ChangeTracker.Entries(<ElementType>))
{
   elementType.Entity.ElementTypeTranslations.Add();
}

Я не тестировал, но было слишком долго вставлять комментарии.

 Krzysztof Skowronek04 окт. 2017 г., 19:10
Я боюсь, что это невозможно. Вам нужно будет выполнить довольно сложный поиск рефракции, чтобы найти все типы со свойством с типом ICollection <ITranslation>. Я предлагаю вам пойти по более короткому пути и определить ITranslationContainer или ITranshable, как я указал в своем комментарии, и заставить FileType и ElementType реализовать его. Тогда просто пройдите все ChangeTracker.Entries <ITranshable>
 Rubens Mussi Cury04 окт. 2017 г., 19:05
В том-то и дело, но я не хотел обрабатывать одну за другой сущность, которая могла бы иметь коллекцию. Вот почему я получал их через интерфейс, а затем пытался получить коллекцию, которая наверняка будет существовать. Я использую рефлексию, чтобы достичь этого, но я не знаю, как преобразовать свойство найденной коллекции для этого объекта в вашем строго типизированном примере.

Ваш ответ на вопрос