3

我有一个快速的问题。

假设上下文是我的 EF 上下文,而Respondent是 EF 从数据库生成的实际 EF 实体。

更新答辩人的最短方法是什么?

public void UpdateRespondent(Respondent respondent)
{
    var resp = context.Respondents.First(r => r.RespondentId == respondent.RespondentId);

    // Now... do I have to copy all properties from the respondent into resp ??
    // But respondent is actually the Respondent entity
    // Can I just replace it somehow?

    context.SaveChanges();
}

谢谢一堆。

更新1

感谢 nrodic,这段代码就像一个魅力:

public void UpdateRespondent(Respondent changed)
{
    var respondent = db.Respondents.FirstOrDefault(r => r.RespondentId == changed.RespondentId);

    db.Respondents.ApplyCurrentValues(changed);
    db.SaveChanges();
}

不过有一个问题 -看起来我根本不需要第一行“var respondent =”!

知道为什么在许多示例中存在这条线吗?

谢谢。

更新2

嗯,看来我需要第一行。否则它会在第二行引发异常 (db.Respondents.ApplyCurrentValues(changed);)

在 ObjectStateManager 中找不到具有与所提供对象的键匹配的键的对象。验证所提供对象的键值是否与必须应用更改的对象的键值匹配。

在此处输入图像描述

4

2 回答 2

0

你可以这样做:

    public void UpdateRespondent(Respondent respondent)
{
    var resp = context.Respondents.First(r => r.RespondentId == respondentId);

    // Now... do I have to copy all properties from the respondent into resp ??
    // But respondent is actually the Respondent entity
    // Can I just replace it somehow?

    resp.Name = "Bob";
    resp.SomeProperty = "SomeValue";
    context.SaveChanges();
}

您可以只更新 resp 对象的属性。尽管看到第一条评论可能并不完全符合您的要求。

于 2013-01-24T16:59:16.913 回答
0

如果加载实体,将其从上下文中分离并更新其属性,则可以使用方法将更改应用于数据库ApplyCurrentValues()。像这样使用它:

public void UpdateRespondent(Respondent changed)
{
    var respondent = db.Respondents.FirstOrDefault(r => r.RespondentId == changed.RespondentId);

    db.Respondents.ApplyCurrentValues(changed);
    db.SaveChanges();
}

请注意,在调用时必须将实体附加到上下文(从数据库中读取)ApplyCurrentValues()。否则InvalidOperationException会抛出:

在 ObjectStateManager 中找不到具有与所提供对象的键匹配的键的对象。验证所提供对象的键值是否与必须应用更改的对象的键值匹配。

如果您使用DbContext而不是ObjectContext,请务必阅读此问题


更新数据库的另一种方法是使用自动映射技术(例如AutomapperValueInjecter )。这是更一般的情况,因为它允许使用 DTO 并且可以很好地控制要更新的内容(以及如何更新)。

于 2013-01-24T22:53:29.563 回答