对于我来说,能够从通过实体框架生成的实体获取属性(被读取和修改)的最简单和最少劳动密集(来自软件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;
我已经阅读了很多关于Reflection的答案,但也评论说它处理繁重(可能对我的需求有点过分)。
我的示例代码可能看起来相当简单(因此解决方案对此毫无意义,真正的代码基于大型表),但如果有某种GetFieldByName函数,我可以显着减少代码,因为我有一个很多重复的代码做同样的事情(只是到不同的列)。
答案 0 :(得分:1)
如果我理解你的问题,我认为你可以使用changetracker(如果实体已经在上下文中)。
dbContext.Entry(customer).CurrentValues["CustomerID"]
将为CustomerID
对象提供customer
的值,前提是它附加到dbContext
实例。
如果它不是上下文的一部分,您可以先使用Attach()
附加,或使用Add()
,如果它应该是新记录。
答案 1 :(得分:1)
如果您不想使用Reflection,我知道的唯一方法就是在您的实体中使用字典,并且您可以将所有这些内容放在基类中,并且您的实体继承它,例如:< / p>
[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 [&#34; CustomerID&#34;];
关于Reflection的性能成本,您可以首次将memberInfos存储在静态字段中,并将其用于所有实例。