2013-09-02 3 views
0

У меня есть таблица GiftCards в моем DBML, у которой есть связанное свойство Audit. Аудит хранится в отдельной таблице. Каждый Аудит имеет связанного с ним Связанного Лица. Также есть стол для людей. Связи устанавливаются и действительны в моем DBML.Неверный граф объекта в Linq to SQL

Проблема в том, что при создании новой подарочной карты я также создаю новый связанный аудит в методе OnCreated(). Но в то же время я также создаю связанного человека, когда создаю новый аудит. Человек является текущим пользователем. Фактически метод OnCreated Audit проверяет, существует ли пользователь.

Проблема заключается в том, что когда я создаю новую подарочную карту, она также создает связанный аудит, и это нормально, и аудит создает связанное Лицо. Но 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; 
     } 
    } 

Когда я создаю новую подарочную карту, я всегда получаю сообщение о том, что он пытается вставить дубликата в таблицу лиц. Я не понимаю, потому что мой статический класс специально проверяет, существует ли Person уже, если да, я возвращаю Person, и я не создаю новый. Тем не менее, GetChangeSet() показывает три вставки, включая Person, что неверно.

Что я здесь делаю неправильно?

ответ

1

Я считаю, что ваша проблема здесь в том, что вы используете несколько контекстов. У вас есть один созданный вашим репозиторием, а другой создается в статическом методе вашего объекта Person. Вы также не прилагаете никаких усилий для присоединения Лица, созданного/полученного из другого контекста, к контексту вашего класса аудита.

Вы должны посмотреть на единую единицу работы, один класс DataContext и выполнить всю свою работу в этом.

+0

Вы были абсолютно правы. Я решил передать контекст данных в качестве параметра для моего статического GetPerson, и он сработал. – Ray

Смежные вопросы