2017-05-05 22 views
0

エンティティフレームワークにリレーショナルレコードを追加するための汎用関数を作成しようとしています。私は次の解決策に取り組んでいます。私がこのすべてについて間違っているとすれば、私を正しい方向に向けることができます。リフレクションを使用してコレクションプロパティを検索し、コレクションに追加

私には以下のクラスがあります。またこれは、エンティティフレームワークにおけるコードの第1のアプローチであることに注意してください。

public class MainTable 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int MainTableID { get; set; } 

    public int LookupID { get; set; } 

    [ForeignKey("LookupID")] 
    public virtual LookupTable Lookups { get; set; } 
} 

public class LookupTable 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int LookupID{ get; set; } 

    public string LookupText { get; set; } 

    public virtual ICollection<MainTable> MainTable { get; set; } 
} 

次に、MainTableとLookupTableの間の関係を追加しようとしている次のコードがあります。私は最初に2つのテーブルクラスの型を渡し、追加するレコードとコレクションプロパティの名前を渡します。

"collectionField"は、キャストしようとするたびにNULLです(ICollection(MainTable))。私は "collectionField"型ICollection(MainTable)になるために、私は間違った方法についてこれを行っていない限り、MainTableレコードを追加する必要があります。

public void AddRelationalRecord<MainTableType, LookupTableType>(MainTableType recordToAdd, string collectionFieldName) 
where MainTableType: class                            
where LookupTableType: class 
    { 
     var collectionField = typeof(LookupTableType) 
             .GetProperties() 
             .Where(prop => prop.Name == collectionFieldName) 
             .FirstOrDefault(); 

     collectionField.Add(recordToAdd);   
    } 
+0

'LookupTableType'のインスタンスを' AddRelationalRecord'に渡すべきではありませんか? –

+0

*それはどれくらい便利ですか?あなたはコンパイル時の型チェックを失い、単純な 'a.Collection.Add(b)'ステートメントに必要なものすべてを提供しなければなりません。これは 'Add'メソッドを有効にカプセル化しません。 –

+0

@Yacoub - はい、正しいです。 LookupTableTypeのインスタンスを渡す必要があります。 – Kogroth

答えて

0

私はこれに私のアプローチを変更することを決めました。誰かが興味があれば、以下のコードが動作します。

public void AddRelationalRecord(object recordToAdd, object recordWithCollection, string collectionFieldName) 
{ 
    var collectionProp = recordWithCollection.GetType().GetProperty(fieldName); 
    collectionProp.PropertyType.GetMethod("Add").Invoke(aaa.GetValue(recordWithCollection, null), new object[] { recordToAdd });   
} 
関連する問題