Пока существует активный экземпляр класса DataContext для отслеживания изменений, LINQ to SQL будет рад вставлять / обновлять / удалять строки в связанной таблице каждый раз, когда объекты в коллекция, которая отображает отношение в модели, модифицируется, и вызывается метод DataContext.SubmitChanges () .
Например:
using (var db = new DataContext())
{
var person = db.Persons.Where(p => p.Name == "Foo").SingleOrDefault();
if (person != null)
{
// Inserts a new row in the 'PersonCategory' table
// associated to the current 'Person'
// and to the 'Category' with name 'Employee'
person.PersonCategories.Add(new PersonCategory() { CategoryName = "Employee" });
// Updates the 'CategoryName' column in the first row
// of the 'PersonCategory' table associated to the current 'Person'
person.PersonCategories(0).CategoryName = "Consultant";
db.SubmitChanges();
}
}
Ситуация немного меняется, если вы вносите изменения в объекты модели в режиме " отключен ", то есть когда экземпляр DataContext, который использовался для первоначального создания этих объектов, больше не существует.
В этом случае операции вставки / удаления в связанных таблицах будут отлично работать , когда объект, имеющий измененную коллекцию, присоединен к новому DataContext с таблицей (TEntity) .Attach метод, за которым следует DataContext.SubmitChanges () .
Однако изменения для любого из существующих объектов в коллекции не будут автоматически применены в связанной таблице . Для этого необходимо вручную вызвать метод Table (TEntity) .Attach для каждого объекта в коллекции.
Вот цитата из документации MSDN :
Когда присоединяется новый объект,
отложенные грузчики для любого ребенка
коллекции (например, EntitySet
коллекции объектов из
связанные таблицы) инициализируются.
Когда SubmitChanges вызывается, члены
из дочерних коллекций помещаются в
неизмененное состояние. Чтобы обновить участников
детской коллекции, вы должны
явно вызвать Attach и указать
это лицо.
Вот конкретный пример:
// The 'Person' object has been detached
// from the originating 'DataContext', which is now disposed
person.PersonCategories.Add(new PersonCategory() { CategoryName = "Employee" });
person.PersonCategories(0).CategoryName = "Consultant";
using (var db = new DataContext())
{
// Will detect added and deleted objects
// in the 'PersonCategory' collection
db.Person.Attach(person);
// Required to detect and modifications
// to existing objects in the 'PersonCategory' collection
foreach (var personCategory in person.PersonCategories)
{
db.PersonCategory.Attach(personCategory);
}
db.SubmitChanges();
}