2017-03-18 56 views
1

對於我來說,能夠從通過實體框架生成的實體獲取屬性(將被讀取和修改)是什麼纔是最簡單和最少的勞動密集型(從軟件POV)?在實體框架中按名稱獲取字段

例(和簡化的代碼)如下:

// <auto-generated> from Entity Framework 
public partial class tblCustomer 
{ 
    public int CustomerID { get; set; } 
    public string Status { get; set; } 
} 

比如我想:

tblCustomer customer = new tblCustomer(); 
int pCustomerID = customer.GetFieldByName("CustomerID"); 
pCustomerID = 100; 

我讀過很多關於思考的答案,同時也評論說,這是沉重的處理(可能對我的需求有點過分)。

我的示例代碼可能看起來相當簡單(所以解決方案將毫無意義,真正的代碼基於大型表),但是如果有某種GetFieldByName函數,我可以顯着減少代碼很多重複的代碼做相同的東西(只是不同的列)。

回答

1

如果我正確理解你的問題,我認爲你可以使用changetracker(如果實體已經在上下文中)。

dbContext.Entry(customer).CurrentValues["CustomerID"]

會給你的CustomerID價值爲customer對象,只要它連接到dbContext實例。

如果它不是上下文的一部分,則可以使用Attach()先附加它,或者使用Add()(如果它應該是新記錄)。

0

如果你不喜歡使用反射,我知道是用在實體字典,你也可以把所有這些東西,在一個基類,你的實體繼承它例如像,唯一的辦法:

 [Serializable] 
public class BaseEntity 
{ 
    Dictionary<string, object> _dic; 

    public BaseEntity() 
    { 
     _dic = new Dictionary<string, object>(); 
    } 

    public object this[string propertyName] 
    { 
     get 
     { 
      return _dic[propertyName]; 
     } 
     set 
     { 
      _dic[propertyName] = value; 
     } 
    }  
} 

public class tblCustomer : BaseEntity 
{ 
    public int CustomerID 
    { 
     get 
     { 
      return (int)this["CustomerID"]; 
     } 
     set 
     { 
      this["CustomerID"] = value; 
     } 
    } 
    public string Status 
    { 
     get 
     { 
      return (string)this["Status"]; 
     } 
     set 
     { 
      this["Status"] = value; 
     } 
    } 
} 

tblCustomer customer = new tblCustomer(); int pCustomerID = customer [「CustomerID」];

以及關於Reflection的性能成本,您可以首次將您的memberInfos存儲在靜態字段中,並將其用於所有實例。

+0

是的,字典似乎是要走的路,而且我不會遇到使用Reflection的問題,因爲它只做了一次。由於字典存儲了這些值的副本,我假設我必須爲所有屬性設置修改器(按照上面的方法不斷更新條目),因此必須修改tt文件以使其以上述格式創建類。 – ProgCoder