3

簡単な質問があります。

コンテキストが私の EF コンテキストであり、応答者がデータベースから EF によって生成された実際の EF エンティティであると仮定します。

Respondentを更新する最短の方法は何ですか?

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();
}

ただし、1 つ質問があります。最初の行「var Respondent =」はまったく必要ないようです !!

多くの例でこの行が存在する理由は何ですか?

ありがとう。

Update2

うーん、その最初の行が必要なようです。それ以外の場合は、2 行目に例外がスローされます (db.Respondents.ApplyCurrentValues(changed);)

提供されたオブジェクトのキーと一致するキーを持つオブジェクトが ObjectStateManager で見つかりませんでした。提供されたオブジェクトのキー値が、変更を適用する必要があるオブジェクトのキー値と一致することを確認してください。

ここに画像の説明を入力

4

2 に答える 2

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 に答える
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 に答える