我必须如何传递MemberInitExpression对象
本文关键字:MemberInitExpression 对象 何传递 | 更新日期: 2023-09-27 17:59:42
当我运行此代码时,我在Update方法处得到一个异常
public void UpdateTeststep(Teststep step)
{
_context.Teststeps.Where(t => t.TeststepId == step.TeststepId).Update(t => step);
_context.SaveChanges();
}
{"The update expression must be of type MemberInitExpression.'r'nParametername: updateExpression"}
我的updateExpression有什么问题?
这是Update方法的源代码:
http://www.symbolsource.org/Public/Metadata/NuGet/Project/EntityFramework.Extended/1.0.0.20/Release/.NETFramework,版本%3Dev4.0/EntityFramework.Extended/EntityFramework.EExtended/EntityFramework.Extended/Extensions/BatchExtension.cs?ImageName=EntityFramework.Extended
第454行:
var memberInitExpression = updateExpression.Body as MemberInitExpression;
if (memberInitExpression == null)
throw new ArgumentException("The update expression must be of type MemberInitExpression.", "updateExpression");
为什么我传递的值为null?我是否以错误的方式通过了测试步骤?
您给Update的是MemberExpression,而不是MemberInit表达式,如果您以前没有处理过编写和解析表达式,这将不会告诉您任何有用的信息。但是,这个异常告诉您必须使用初始化新对象属性的代码。
Update(t => step) // member expression because step is a variable
Update(t=> new Something{ Step=step}) // member init expression
简单地说,您需要始终实例化至少具有一个属性的对象才能工作。
假设在DbContext派生类TestDbContext
:上有一个实体Person
和相应的集合Persons
public class Person
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
然后,使用EntityFrameworkExtended的批更新可以这样写:
[TestMethod]
public void UpdatePersonName()
{
using (var context = new TestDbContext())
{
// insert 'initial' person to be renamed
context.Persons.Add(new Person {Name = "andyp"});
context.SaveChanges();
Assert.AreEqual(1, context.Persons.Count());
Assert.AreEqual("andyp", context.Persons.Select(p => p.Name).Single());
// update the persons name
context.Persons
.Where(p => p.Id == 1)
.Update(p => new Person {Name = "Pascal"});
// assert that the update has been successful
Assert.AreEqual(1, context.Persons.Count());
Assert.AreEqual("Pascal", context.Persons.Select(p => p.Name).Single());
}
}
注意,我只更新了一个实体(Id == 1
),但选择多个实体的where condition
当然也是有效的。更新表达式还允许一次更改多个属性。