【发布时间】:2021-05-14 15:14:48
【问题描述】:
我正在开发一个以.Net 5 为目标的.Net core 项目。
我有一个方法会接收一个参数,他的类型是Expression<Func<T , object[]>>,在方法内部我会循环从表达式返回的所有属性。
我的尝试:
public virtual void UpdateExcept( TEntity record, params Expression<Func<TEntity , object[]>>[] propertiesToBeExcluded )
{
//Some logic here
foreach ( var property in propertiesToBeExcluded )
{
foreach ( var prop in property.GetMemberAccessList() )
{
//Here I got the property name (I think)
var x = prop.Name;
}
}
}
在运行时出现此错误:
ArgumentException: 表达式 'x => new [] {x.CreatedBy, Convert(x.CreatedOn, Object)}' 不是有效的成员访问权限 表达。表达式应该代表一个简单的属性或字段 访问:'t => t.MyProperty'。当指定多个属性或 字段,使用匿名类型:'t => new { t.MyProperty, t.MyField }'。 (参数'propertyAccessExpression')
更多解释:
实际上,我在基于Entity framework 的存储库中创建了此方法,此方法应更新TEntity 记录并忽略(不更新)propertiesToBeExcluded 中的某些已发送属性有时我会更新记录并忽略一个属性,然后在另一次我将更新一条记录并忽略许多属性。
我试过的原始方法逻辑:
public virtual void UpdateExcept( TEntity record, params Expression<Func<TEntity , object[]>>[] propertiesToBeExcluded )
{
var entity = Context.Set<TEntity>();
entity.Attach( record );
Context.Entry( record ).State = EntityState.Modified;
foreach ( var property in propertiesToBeExcluded )
{
foreach ( var prop in property.GetMemberAccessList())
{
Context.Entry( record ).Property( prop.Name ).IsModified = false;
}
}
}
此方法的使用示例:
_studentRepository.UpdateExcept( record : student , propertiesToBeExcluded : x => new object[] {x.Picture} );
另一个例子:
_studentRepository.UpdateExcept( record : student , propertiesToBeExcluded : x => new object[] {x.CreatedOn, x.CreatedBy} );
这个方法是这样的结构:
public virtual void UpdateExcept( TEntity record, params Expression<Func<TEntity , object>>[] propertiesToBeExcluded )
{
var entity = Context.Set<TEntity>();
entity.Attach( record );
Context.Entry( record ).State = EntityState.Modified;
foreach ( var property in propertiesToBeExcluded )
{
Context.Entry( record ).Property( property ).IsModified = false;
}
}
旧结构的使用示例:
_studentRepository.UpdateExcept( record : student , propertiesToBeExcluded : x => x.CreatedOn, x => x.CreatedBy );
为什么我从旧结构更改为新结构:
因为如果您注意到在旧结构中,我必须多次为func 编写x 的参数,而我不知道如何使用它一次并返回多个属性。
property.GetMemberAccessList()
我希望所有这些都可以帮助您理解这个问题,所以请帮助您解决这个问题?
【问题讨论】:
-
什么是
property.GetMemberAccessList()? -
@IvanStoev see here
-
好的,现在我明白了。但请注意,这不是我们甚至不应该使用的标准(实际上是内部)EF Core 方法,因此至少您可以在问题中提到(或提供链接)。无论如何,除此之外我理解这个问题。
-
不知道你是否明白,或者你有没有解决这个问题的办法,谢谢
标签: c# reflection entity-framework-core repository-pattern