エンティティフレームワークにリレーショナルレコードを追加するための汎用関数を作成しようとしています。私は次の解決策に取り組んでいます。私がこのすべてについて間違っているとすれば、私を正しい方向に向けることができます。リフレクションを使用してコレクションプロパティを検索し、コレクションに追加
私には以下のクラスがあります。またこれは、エンティティフレームワークにおけるコードの第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);
}
'LookupTableType'のインスタンスを' AddRelationalRecord'に渡すべきではありませんか? –
*それはどれくらい便利ですか?あなたはコンパイル時の型チェックを失い、単純な 'a.Collection.Add(b)'ステートメントに必要なものすべてを提供しなければなりません。これは 'Add'メソッドを有効にカプセル化しません。 –
@Yacoub - はい、正しいです。 LookupTableTypeのインスタンスを渡す必要があります。 – Kogroth