gpt4 book ai didi

c# - 使用反射动态地将对象添加到 Entity Framework

转载 作者:太空狗 更新时间:2023-10-30 00:40:53 26 4
gpt4 key购买 nike

在下面的代码中,domainObject 的类型有所不同(但以DO 结尾,然后我对其进行修剪以获取相应的表名)。有了表的名称及其类型,我想更新一个现有对象 - 由于 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");
}
}

通常,知道实际的表而不仅仅是它的类型,我现在会通过以下方式获取 POCO

var poco = context.TableName.Single(item => item.ID == id);

这里有两个问题:

(1) Single 是一种扩展方法。

(2) 我不知道如何以 object 的形式获取 lambda 表达式以将其传递给 Single< 的 Invoke/.

是否有任何方法可以通过反射来做到这一点,或者我是否必须解决这个问题? (例如,我可以遍历 table 中的项目并手动检查 [这会将数据库中的所有内容加载到内存中,因此应该避免],或者可以配置 EF 来执行某种 ' override' 每当我只是 Add 并且对象的 ID 已经存在(如果可能的话)。即使假设我可以解决这个问题,我仍然想知道这个问题的明确答案,因为它对我来说非常有趣!

最佳答案

如果你想使用反射并通过 ID 找到给定的实体,那么如果 ID 是主键,这就相当简单了,因为这就是你所要做的:

object entity = context.Set(domainObject.GetType()).Find(id);

如果您的属性不是主键,那么您需要按如下方式进行:

ParameterExpression p = Expression.Parameter(domainObject.GetType());
Expression property = Expression.Property(p, "ID");
Expression c = Expression.Constant(id);
Expression body = Expression.Equal(property, c);
Expression exp = Expression.Lambda(body, new ParameterExpression []{ p });

MethodInfo singleMethod = typeof(Queryable).GetMethods()
.Single(m => m.Name == "Single" && m.GetParameters().Count() == 2)
.MakeGenericMethod(domainObject.GetType());

DbSet dbSet = context.Set(domainObject.GetType());
object entity = singleMethod.Invoke(null, new object[]{ dbSet, exp });

首先使用 Expression 类构建将传递给 Single 方法的表达式(在您的情况下这将是 p => p.ID == id )。然后从 Queryable 类中搜索合适的 Single 方法。最后一件事是使用适当的参数调用此方法。这样您就可以使用 Reflection 进行任何 linq 查询。

关于c# - 使用反射动态地将对象添加到 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24058410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com