2

このメソッドを 2 つのケースでデバッグしています。1 つは親がある場合、もう 1 つは親がない場合です。

親がいない場合、新しい Person の ID は 0 ですが、実際にはデータベースに保存されません。

親が存在する場合、このメソッドでは新しい Person の id は 0 になりますが、正しい値 (テーブルの最大値より 1 大きい値) を持つ新しいレコードがデータベースに挿入されます。

ここで何が起こっているのですか?私は何か間違ったことをしていることを知っていますが、何がわからないだけです。

私はEF Codefirstを使用しています。

コントローラ メソッドのコード:

[HttpPost]
public ActionResult Create(CreatePersonViewModel viewModel)
{
    if (ModelState.IsValid)
    {

        var parent = _db.Persons.FirstOrDefault(s => s.PersonId == viewModel.ParentId);

        var person = new Person() { Name = viewModel.Name };

        // if it has a parent, build new relationship
        if (parent != null)
        {
            person.Parent = parent;
            parent.Children.Add(person);
        };

        _db.Save();

        return RedirectToAction("detail", "person", new { personId = person.PersonId });
    }
    return View(viewModel);
}
4

2 に答える 2

1

あなたが参照しているという事実は、オブジェクトの自動インクリメント ID です。ORM によって制御されます。あなたはこの質問をチェックしたいかもしれません

msdnからこのリンクを確認することをお勧めします。

解説 Refresh には、オブジェクトをデータ ソースからのデータで更新できるようにすることと、競合を解決できるメカニズムを提供するという 2 つの目的があります。詳細については、「変更の保存と同時実行の管理 (Entity Framework)」を参照してください。オブジェクトが更新される順序は決定論的ではありません。Refresh メソッドが呼び出された後、オブジェクトの元の値は常にデータ ソースの値で更新されますが、現在の値はデータ ソースの値で更新される場合と更新されない場合があります。これは、RefreshMode によって異なります。StoreWins モードは、データ ソースの値と一致するようにオブジェクトを更新する必要があることを意味します。ClientWins 値は、データ ソースに他の変更があった場合でも、オブジェクト コンテキストの変更のみが保持されることを意味します。

于 2013-02-17T19:26:15.967 に答える
1

親がいない場合、新しい Person の ID は 0 ですが、実際にはデータベースに保存されません。

これは、エンティティを永続化する必要があることを EF に伝えていないためです。を作成するだけで、new Person()それだけです。

やったほうがいい:

dbContext.AddToPersons(person);

電話する前にdbContext.SaveChanges()

親がいる場合はpersonとの関係で救われるparent

アップデート

ふと思いついたのですが、最初にコードを作成している場合AddToPersons(...)、データ コンテキストでメソッドを使用できない可能性があります。その場合は、dbContext.Persons.AddObject(person)代わりに使用できます。

于 2013-02-17T19:43:17.820 に答える