【发布时间】:2015-11-14 19:38:55
【问题描述】:
在下面的代码中,domainObject 的类型有所不同(但以DO 结尾,然后我对其进行修剪以获得相应的表名)。有了表的名称及其类型,我想使用来自domainObject 的新属性值在数据库中更新现有对象 - 由于 EF,它的名称与 tableName 相同。因此,我必须先在表中找到具有相同ID 的 POCO 来覆盖它。这是到目前为止的代码:
public void Update(object domainObject)
{
Type type = domainObject.GetType();
string tableName = type.Name.Substring(0, type.Name.Length - 2);
PropertyInfo tableProp = typeof(MyDbContext).GetProperty(tableName);
Type tableType = tableProp.PropertyType;
Type pocoType = tableType.GetGenericArguments()[0];
int id = (int)type.GetProperty("ID").GetValue(domainObject);
using (var context = new MyDbContext())
{
object table = tableProp.GetValue(context);
MethodInfo singleMethod = tableType.GetMethod("Single");
}
}
通常,知道实际表而不仅仅是它的类型,我现在可以通过
获取 POCOvar poco = context.TableName.Single(item => item.ID == id);
这里有两个问题:
(1)Single是一种扩展方法。
(2) 我不知道如何以 object 的形式获取 lambda 表达式以将其传递给 Single 的 Invoke。
有没有办法用反射来做到这一点,还是我必须解决这个问题? (例如,我可以遍历table 中的项目并手动检查[这会将数据库中的所有内容加载到内存中,因此应该避免],或者可以将 EF 配置为执行某种“覆盖”,只要我只是Add 和 ID 的对象如果可能的话已经存在)。即使假设我可以解决这个问题,我仍然想知道这个问题的明确答案,因为这对我来说非常有趣!
【问题讨论】:
-
使用泛型似乎是一个更好的主意...
-
使用 DbEntry 怎么样?
-
@JanneMatikainen 你能详细说明一下吗?我对这一切都很陌生,所以我只知道(一点)Entity Framework 6,我肯定在那里错过了很多观点。
-
在实体框架中使用反射添加对象试图达到什么目的?
-
@RaphaëlAlthaus 我绞尽脑汁思考如何做到这一点,但我看不到方法。我从 ASP.NET 应用程序中的
WebDataGrid获取这些对象,该应用程序具有IList作为已切换的 DataSource,因此没有固定类型可以作为通用传递(或不知道如何传递)。跨度>
标签: c# entity-framework system.reflection