У меня есть таблица 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, что неверно.
Что я здесь делаю неправильно?
Вы были абсолютно правы. Я решил передать контекст данных в качестве параметра для моего статического GetPerson, и он сработал. – Ray