0

DBML に、Audit という関連プロパティを持つ GiftCards テーブルがあります。監査は別のテーブルに保存されます。各監査には、関連する個人が関連付けられています。Persons テーブルもあります。リレーションシップが設定され、DBML で有効になります。

問題は、新しいギフト カードをインスタンス化するときに、OnCreated() メソッドで新しい関連する監査も作成することです。しかし同時に、新しい Audit をインスタンス化するときに、関連する Person も作成します。Person は現在のユーザーです。実際には、Audit の OnCreated メソッドは、ユーザーが既に存在するかどうかを確認します。

問題は、新しいギフトカードをインスタンス化すると、関連する監査も作成されますが、これは問題なく、監査は関連する人物を作成します。しかし、Person はデータベースに既に存在します。データ コンテキストの GetChangeSet() を見ると、3 つの挿入が表示されます。Persion はデータベースに既に存在するため、挿入として表示されません。

これが私がこれをどのように実装したかです。これは、コントローラーがギフト カードを受け取る MVC アプリケーションです。

[HttpPost]
    public ActionResult Save(GiftCardViewModel giftCard)
    {
        if (ModelState.IsValid)
        {
            GiftCard gc = GiftCardViewModel.Build(giftCard);
            repository.InsertOrUpdate(gc);
            repository.Save();
            return View("Consult", new GiftCardViewModel(repository.Find(gc.GiftCardID)));
        }
        else
            SetupContext();
        return View("_Form", giftCard);
    }

ギフトカードには次のものがあります。

partial class GiftCard
{
    partial void OnCreated()
    {
        // Set up default audit.
        this.Audit = new Audit();
    }
}

Audit クラスには次のものがあります。

partial void OnCreated()
    {
        // Setup timestamp
        this.Timestamp = DateTime.Now;

        this.Person = Person.GetPerson(Membership.GetUser().UserName);
    }

最後に、私の Person クラスには次のものがあります。

public static Person GetPerson(String username)
    {
        using (GiftCardDBDataContext database = new GiftCardDBDataContext())
        {
            // Try to get the person from database
            Person person = database.Persons.SingleOrDefault(personData => SqlMethods.Like(personData.Username, username));

            if (person == null)
            {
                person = new Person()
                {
                    Username = username,
                    FullName = "Full name TBD"
                };
                database.Persons.InsertOnSubmit(person);
                database.SubmitChanges();
            }

            // Return person data
            return person;
        }
    }

新しいギフト カードを作成すると、Persons テーブルに重複する人物を挿入しようとしているというエラーが常に表示されます。静的クラスが Person が既に存在するかどうかを明確にチェックするため、わかりません。存在する場合は Person を返し、新しいものは作成しません。しかし、GetChangeSet() は Person を含む 3 つの挿入を示していますが、これは間違っています。

ここで何が間違っていますか?

4

1 に答える 1