Я делаю клон некоторых сущностей, чтобы привязать их к некоторой сетке и избежать отслеживания объектов на предмет изменений, например:
var cloneEntities = DataContext.SomeTable.FirstOrDefault().
SomeChildTable.Select (
x => new SomeChildTable { SomeProperty = x.SomeProperty }
);
Некоторые свойства являются не примитивными типами, а объектами DataContext (другие объекты). После этого объекты на cloneEntities
помечаются так, как будто я сделал SomeChildTable.InsertAllOnSubmit(cloneEntities)
, чего я не сделал.
Если я не инициализирую какое-либо свойство объекта, объекты не помечаются для вставки.
Как получить клон дочерних объектов, не помечая их для вставки?.
Спасибо
UPATE:
Кажется, я недостаточно ясен, так что давайте приведем пример.
У нас есть таблицы Employee и Store, некоторые сотрудники могут работать во многих магазинах, поэтому у вас есть таблица EmployeeStore для отслеживания магазинов, в которых работает сотрудник:
Employee
=======
Code int not null identity (1,1)
Name varchar(20)
Primary on Code
Store
=====
Code int not null identity (1,1)
Name varchar(20)
Primary on Code
EmployeeStore
=============
CodeEmployee int
CodeStore int
Primary on CodeEmployee and CodeStore
Если я редактирую сотрудника, я хочу представить магазины в сетке, и они должны иметь возможность добавлять новые магазины.
Сначала это работает, но если я пытаюсь обновить какую-либо строку в сетке, (пользователь вместо удаления хранилища A и добавления хранилища B меняет строку сетки с хранилищем A и выбирает хранилище B), я получил исключение, потому что Я пытаюсь изменить EmployeeStore.StoreCode, который является частью первичного ключа.
Так что вместо этого я хочу сделать что-то вроде:
var employee = DataContext.Employee.First();
var clonedStores = new BindingList<EmployeeStore>(employee.Stores.Select (
x => new EmployeeStore {Store = x.Store}));
//Bind to stores to grid and later on do
DataContext.EmployeeStore.DeleteAllOnSubmit(employee.Stores);
employee.Stores.AddRange(clonedStores);
DataContext.SubmitChanges();
Но это не сработает, потому что, когда я создаю clonedStores
, он помечается, как если бы я сделал InsertAllOnSubmit()
, поэтому он вылетает, если я пытаюсь удалить объект Employee.
Кажется, что я делаю что-то ужасное неправильно, но я не могу понять, что, потому что это такой распространенный сценарий.
Спасибо за вашу помощь и мысли.