2017-10-04 10 views
0

特定のインターフェイスを実装するすべてのエンティティに不足している言語エントリを追加する一般的な方法を作成する必要があります。私は自分のコレクションのプロパティを取得する方法を知ったが、私はまだの前に新しい値を追加するにはを知らない。エンティティのナビゲーションプロパティコレクションに新しいエントリを追加する

私の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. 
     } 
    } 
} 

クラスのコードサンプルはChangeTrackerから

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; } 
} 
+0

もっと教えてください。何が効いていないのですか?新しい翻訳エンタントを追加するコードはどのように見えますか? –

+0

@ KrzysztofSkowronekあなたがモデルをいくつかのコレクションのプロパティを持っていると想像し、ChangeTrackerからこのコレクションを変更したいと思っています。このコレクションには既知の構造があると考えてください。 –

+0

OKですが、上記のコードでは動作しないのは何ですか?私はあなたがオーバーライドメソッドの最後のものとしてbase.SaveCahngesを呼び出すことを控えているので、あなたが望むことをする必要があります。このコレクションはITranslationインターフェイスの一部ですか?または、この翻訳オブジェクトのコレクションですか? –

答えて

1

エントリは

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

とのElementTypeのために元のエンティティを保持しているエンティティと呼ばれるプロパティがあります。

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

を私はしませんでしたテストしかし、それはコメントに貼り付けるには余りにも長かった。

+0

それがポイントですが、コレクションを持つことができるエンティティを1つずつ処理する必要はありませんでした。だからこそ私はInterfaceによってそれらを手に入れ、確かに存在するコレクションを手に入れようとしていました。私はこれに到達するために反射を使用していますが、私は強力な型付きの例では、このオブジェクトで発見されたコレクションプロパティを変換する方法を知らない。 –

+0

私はそれが不可能だと恐れています。 ICollection のタイプのプロパティを持つすべてのタイプを見つけるには、かなり複雑なリフレクション検索を実行する必要があります。私はあなたのコメントに記載されているように、より短い方法で行って、ITranslationContainerまたはITranslatableを定義し、FileTypeとElementTypeでそれを実装することをお勧めします。それから、すべてのChangeTracker.Entries