Linq to sql объект помечает его для вставки автоматически - PullRequest
1 голос
/ 04 февраля 2010

Я делаю клон некоторых сущностей, чтобы привязать их к некоторой сетке и избежать отслеживания объектов на предмет изменений, например:

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.

Кажется, что я делаю что-то ужасное неправильно, но я не могу понять, что, потому что это такой распространенный сценарий.

Спасибо за вашу помощь и мысли.

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Ваша проблема в том, что вы добавляете дочерние сущности обратно в ту же сущность. Изменить утверждение на:

var cloneEntities = DataContext.SomeTable.FirstOrDefault().SomeChildTable.Select(x => new { SomeProperty = x.SomeProperty }); 

UPDATE:

Исходя из новой информации, у вас будут проблемы, если вы только измените значение первичного ключа. Я бы предложил что-то вроде этого:

var entitiesToMove = DataContext.SomeTable.FirstOrDefault().SomeChildTable;

foreach (SomeChildTable item in entitiesToMove)
    DataContext.SomeTable.Where(a => a.SomeTable_ID == newID).SomeChildTable.Add(item);

DataContext.SubmitChanges();

Таким образом, вам не нужно беспокоиться об удалении чего-либо ... вы просто обновляете ссылку на внешний ключ для дочерних записей.

ОБНОВЛЕНИЕ № 2:

Первое, что вы должны сделать, это изменить структуру таблицы EmployeeStore на:

EmployeeStore_ID  int not null identity (1, 1)
CodeEmployee      int     (FK to Employee)
CodeStore         int     (FK to Store)

LINQ-to-SQL работает лучше всего, когда вы правильно настроили отношения с внешним ключом. Он также не очень любит составные первичные ключи, поэтому вы получили исключение, когда пытались изменить значение CodeStore.

Как только это будет сделано, вы сможете перенести сотрудника в другой магазин, просто изменив поле EmployeeStore.CodeStore на существующее Store.Code и позвонив по номеру DataContext.SubmitChanges().

0 голосов
/ 04 февраля 2010

Вы пытались отсоединить объект http://msdn.microsoft.com/en-us/library/bb738611.aspx? Не можете сказать, есть ли у вас фрагмент кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...