3

当我运行此代码时,我在 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,Version%3Dv4.0/EntityFramework.Extended/EntityFramework.Extended/EntityFramework.Extended/Extensions /BatchExtensions.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");

为什么我传递的值是空的?我是否以错误的方式通过了我的测试步骤?

4

2 回答 2

5

您正在给 Update 一个 MemberExpression 而不是一个 MemberInit 表达式,如果您以前没有处理过编写和解析表达式,这不会告诉您任何有用的信息。但是,此异常告诉您必须使用代码来初始化新对象的属性。

Update(t => step) // member expression because step is a variable
Update(t=> new Something{ Step=step}) // member init expression 

简而言之,您需要始终使用至少一个属性实例化一些对象才能工作。

于 2014-05-05T18:24:42.077 回答
0

假设在 DbContext 派生类上有Person一个具有相应集的实体:PersonsTestDbContext

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选择多个实体当然也是有效的。更新表达式还允许一次更改多个属性。

于 2014-05-05T18:16:31.140 回答