在Entity Framework中按名称获取字段

时间:2017-03-18 17:02:39

标签: c# .net entity-framework

对于我来说,能够从通过实体框架生成的实体获取属性(被读取和修改)的最简单和最少劳动密集(来自软件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函数,我可以显着减少代码,因为我有一个很多重复的代码做同样的事情(只是到不同的列)。

2 个答案:

答案 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存储在静态字段中,并将其用于所有实例。