Linq to sql Linq to SQL中的对象图无效

Linq to sql Linq to SQL中的对象图无效,linq-to-sql,Linq To Sql,我的DBML中有一个GiftCards表,它有一个名为Audit的相关属性。审核存储在单独的表中。每个审计都有一个相关人员。还有一张人员表。这些关系已设置并在我的DBML中有效 问题是,当我实例化一张新的礼品卡时,我还在OnCreated()方法中创建了一个新的相关审计。但同时,当我实例化一个新的审计时,我也创建了一个相关人员。此人是当前用户。实际上,审计的OnCreated方法检查用户是否已经存在 问题是,当我实例化一张新的礼品卡时,它也会创建一个关联的审计,这很好,审计会创建一个关联人员。但

我的DBML中有一个GiftCards表,它有一个名为Audit的相关属性。审核存储在单独的表中。每个审计都有一个相关人员。还有一张人员表。这些关系已设置并在我的DBML中有效

问题是,当我实例化一张新的礼品卡时,我还在OnCreated()方法中创建了一个新的相关审计。但同时,当我实例化一个新的审计时,我也创建了一个相关人员。此人是当前用户。实际上,审计的OnCreated方法检查用户是否已经存在

问题是,当我实例化一张新的礼品卡时,它也会创建一个关联的审计,这很好,审计会创建一个关联人员。但是这个人已经存在于数据库中了。当我查看数据上下文的GetChangeSet()时,它显示了3个插入。person不应显示为insert,因为它已存在于数据库中

下面是我如何实现的。这是一个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);
    }
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;
        }
    }
最后,我的Person类有:

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

        this.Person = Person.GetPerson(Membership.GetUser().UserName);
    }
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表中插入一个重复的人。我不明白,因为我的静态类专门检查这个人是否已经存在,如果是,我返回这个人,而不创建一个新的人。然而,GetChangeSet()显示了三个插入,包括Person,这是错误的


我做错了什么?

我相信你的问题在于你使用了多个上下文。其中一个是由存储库创建的,另一个是在Person对象的静态方法中创建的。您也没有试图将从其他上下文创建/检索的人员附加到审计类的上下文


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

您完全正确。我决定将数据上下文作为参数传递给我的静态GetPerson,它成功了。