Так что у меня действительно трудное время, чтобы понять, когда я должен прикрепляться к объекту, а когда я не должен прикрепляться к объекту. Прежде всего, вот небольшая диаграмма моей (очень упрощенной) объектной модели.
![Schema](https://i.imgur.com/2ROFI.png)
В моем DAL я создаю новый DataContext каждый раз, когда я выполняю операцию, связанную с данными. Скажем, например, я хочу сохранить нового пользователя. На своем бизнес-уровне я создаю нового пользователя.
var user = new User();
user.FirstName = "Bob";
user.LastName = "Smith";
user.Username = "bob.smith";
user.Password = StringUtilities.EncodePassword("MyPassword123");
user.Organization = someOrganization; // Assume that someOrganization was loaded and it's data context has been garbage collected.
Теперь я хочу пойти сохранить этого пользователя.
var userRepository = new RepositoryFactory.GetRepository<UserRepository>();
userRepository.Save(user);
Neato! Вот моя логика сохранения:
public void Save(User user)
{
if (!DataContext.Users.Contains(user))
{
user.Id = Guid.NewGuid();
user.CreatedDate = DateTime.Now;
user.Disabled = false;
//DataContext.Organizations.Attach(user.Organization);
DataContext.Users.InsertOnSubmit(user);
}
else
{
DataContext.Users.Attach(user);
}
DataContext.SubmitChanges();
// Finished here as well.
user.Detach();
}
Итак, мы здесь. Вы заметите, что я закомментировал бит, где DataContext присоединяется к организации. Если я присоединяюсь к организации, я получаю следующее исключение:
NotSupportedException: Была предпринята попытка присоединить или добавить
сущность, которая не нова, возможно, имея
был загружен из другого DataContext.
Это не поддерживается.
Хм, это не работает. Позвольте мне попробовать это без присоединения (то есть закомментируйте эту строку о присоединении к организации).
DuplicateKeyException: Невозможно добавить объект с ключом, который уже
используется.
WHAAAAT? Я могу только предположить, что это попытка вставить новую организацию, которая, очевидно, является ложной.
Так в чем же дело, ребята? Что я должен делать? Каков правильный подход? Кажется, что L2S делает это немного сложнее, чем должно быть ...
РЕДАКТИРОВАТЬ: Я только что заметил, что если я пытаюсь посмотреть ожидающий набор изменений (dataContext.GetChangeSet ()), я получаю то же исключение NotSupportedException, которое я описал ранее !! Какого черта, L2S?!