0

我的 DBML 中有一个 GiftCards 表,它有一个名为 Audit 的相关属性。审计存储在单独的表中。每个审计都有一个与之关联的相关人员。还有一个 Persons 表。关系已建立并且在我的 DBML 中有效。

问题是当我实例化一张新的礼品卡时,我还在 OnCreated() 方法中创建了一个新的相关审计。但同时,当我实例化一个新的 Audit 时,我也会创建一个相关的 Person。Person 是当前用户。实际上,审计的 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();
    }
}

审计类有:

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,这是错误的。

我在这里做错了什么?

4

1 回答 1

1

我相信您的问题是您正在使用多个上下文。您有一个由您的存储库创建,另一个是在您的 Person 对象的静态方法中创建的。您也没有做出任何努力将从其他上下文创建/检索的 Person 附加到 Audit 类的上下文。

您应该查看单个工作单元、单个 DataContext 类,并在其中执行所有工作。

于 2013-09-02T05:03:17.367 回答