1

新しいエントリを作成する前に、データベース内の既存のエントリを確認する方法を検討しています。

Person2つの値RowIdと。を持つ非常に単純なテーブルがありますUserId。これらは同じ値ではなく、UserId外部サービスからの値であり、潜在的に何でもかまいませんがRowId、私のシステムの一意の識別子です。

Personを外部オブジェクトとして持つオブジェクトを保存してモデル化するときは、を使用してオブジェクトにデータを入力し、オブジェクトをUserId保存するときに、そのレコードがUserId存在するかどうかを確認し、新しいレコードを作成する代わりにそのレコードを使用するかどうかを確認します。

SaveChanges()私は自分のメソッドをオーバーライドすることを考えていましDbContextたが、これがここで実行できるかどうかはわかりません。

誰かが私がこれについてどうやって行くことができるかについて何か考えを持っていますか、それとも私は私のコントローラーにログインを実装する方が良いでしょうか?

私はそれを文脈に入れるために私が現在どのように物事をしているのかを示すと思いました:

コントローラ:

public MvcHtmlString UpdatePanelDetails(int id, FormCollection values)
{

    Panel panel = db.Panels.Find(id);

    bool worked = TryUpdateModel(panel,values);

    if (ModelState.IsValid)
    {
        db.Entry(panel).State = System.Data.EntityState.Modified;
        db.SaveChanges();
        return new MvcHtmlString("Success");
    }
    else
    {
        return new MvcHtmlString("Failed");
    }
}

このPanelモデル内に私のPersonオブジェクトがあります。私のビュー内で、バインドされている非表示のテキストボックスにデータを入力する外部の人物システムを検索しているPerson.UserIdので、にTryUpdateModelバインドPersonされてPanelいますが、RowIdは0です。

私が望んでいるのは、正しい場所にデータを入力できる単一の場所RowId(その人がすでに存在する場合)を作成できるようにすることです。そのため、SaveChangesメソッドのオーバーライドを検討していました。

私は今、それは不可能であり、人の検索の一部としてそれを行い、2つの隠されたテキストボックスを持っている方が良いと考えています。

4

1 に答える 1

0

と はテーブルの複合主キーであると思いRowIdます。これは、すでに存在するエントリを保存しようとすると、一意の制約のために が発生することを意味します。重複したエントリとして保存されないため、この例外を処理して値を使用できます。UserIdPersonException

try
{
    DbContext.SaveChanges();
}
catch (Exception ex)
{
    // If the unique constraint is violated you end up here.
}

を処理しないためにException、次のことができます。

var person = DbContext.Persons.Where(p => p.UserId == userId).SingleOrDefault();
if (person == null)
{
    DbContext.Persons.Add(new Person(userId));
    DbContext.SaveChanges();
}
于 2013-03-03T16:05:52.257 に答える