Если говорить прямо, то с точки зрения дизайна неправильно раскручивать DataContext
экземпляров в Add
и Update
методах.
Предположительно, эти методы принадлежат к какому-то классу репозитория - в этом случае репозиторий должен быть инициализирован с уже существующим DataContext
, обычно передаваемым через конструктор.
Если вы создаете свой репозиторий таким образом, вам не нужно беспокоиться об этой проблеме:
public class FooRepository
{
private MyDataContext context;
public FooRepository(MyDataContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this.context = context;
}
public void Add(Foo foo)
{
context.FooTable.InsertOnSubmit(foo);
}
public void Update(Foo foo)
{
Foo oldFoo = context.FooTable.Single(f => f.ID == foo.ID);
oldFoo.Bar = foo.Bar;
oldFoo.Baz = foo.Baz;
}
}
Затем, откуда вы выполняете свои обновления:
Foo fooToSave = GetFooFromWherever();
using (MyDataContext context = new MyDataContext(...))
{
FooRepository repository = new FooRepository(context);
repository.Save(fooToSave);
context.SubmitChanges();
} // Done
Этот шаблон можно использовать и использовать повторно, и вы можете объединить несколько репозиториев в одну «транзакцию»; вы никогда не столкнетесь с какими-либо проблемами. Вот как на самом деле предполагалось использовать DataContext
, который включает в себя шаблон единицы работы.
Между прочим, при проектировании хранилища принято пытаться абстрагироваться от громоздкой Insert
/ Update
семантики и просто предоставлять метод Save
:
public void Save(Foo foo)
{
if (foo.ID == default(int))
{
Insert(foo);
}
else
{
Update(foo);
}
}
Таким образом, вам не всегда нужно беспокоиться о том, вставили ли вы уже Foo
.
возможно принудить Linq к SQL для работы с отсоединенными сущностями, но удачи вам в том, чтобы иметь дело с сущностями, которые уже прикреплены к другой контекст . И даже в отдельном случае, это действительно довольно громоздко, вам нужно иметь поля меток времени на всех ваших таблицах / сущностях или начать возиться со свойствами проверки версии / автосинхронизации - это не стоит IMO, просто спроектируйте свои репозитории для использования один контекст для каждого экземпляра и для совместного использования экземпляров контекста.