2017-05-05 70 views
0

我想創建一個通用函數來在實體框架中添加關係記錄。我正在研究以下解決方案。儘管如果我正在談論這個問題,你能否指引我走向正確的方向。使用反射找到一個集合屬性,然後添加到集合

我有以下幾個類。還要注意這是實體框架中的第一種代碼方法。

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之間的關係。我首先傳遞兩個表類類型並傳遞記錄添加和集合屬性的名稱。

問題是,只要我嘗試轉換它(ICollection(MainTable)),「collectionField」就是NULL。我需要將「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 });   
} 
相關問題