Почему в Linq to SQL назначение связанной сущности создает вставку ChangeSet? - PullRequest
3 голосов
/ 20 июля 2010

Почему при добавлении вставки (нового адреса) к DataStent ChangeSet добавляется следующее, и как я могу помешать этому?

var db = new DataClasses1DataContext();
var a = new Address();
a.StateProvince = db.StateProvinces.First();
Console.WriteLine(db.GetChangeSet().Inserts.Count);

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

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

Address.StateProvinceID = db.StateProvinces.First().StateProvinceID;

Если вы можете работать без прямой ссылки на объект. Нет прямого способа отсоединить сущность в LINQ to SQL, кроме как через PLINQO (http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1).

2 голосов
/ 20 июля 2010

Address a = new Address ();

Это создает новый экземпляр Address. Он никак не связан с текстом данных.

db.StateProvinces.First ();

Это загружает экземпляр StateProvince. Экземпляр отслеживается по текстовому тексту, который его загрузил (дБ). БД ожидает уведомлений об изменениях из этого экземпляра.

a.StateProvince =

Вот присвоение собственности. Если вы проверите автоматически сгенерированное свойство «StateProvince», то увидите, что оно также обновляет связанное свойство «Адреса» в экземпляре StateProvince. Теперь экземпляр StateProvince изменился. Это приводит к тому, что db получает уведомление, и в результате - экземпляр адреса теперь отслеживается db как новый, готовый к вставке экземпляр.

Простейшим выходом из этого является, перед использованием db, установить:

db.ObjectTrackingEnabled = false;

PS. вар классный, как хот-доги классные.

1 голос
/ 20 июля 2010

Это происходит потому, что вы получаете «StateProvince» и устанавливаете внешний ключ на новом адресе в существующую провинцию штата, поскольку адрес новый, тогда набор изменений создаст для него вставку, так как я подозреваю, что изменил провинцию штата, добавив новый адрес в коллекцию адресов на объекте StateProvince. Вы можете попытаться удалить дочернее свойство из ассоциации, поскольку, вероятно, бесполезно иметь наборы связанных адресов в объекте провинции штата.

Вы также можете попробовать следующее:

DataClasses1DataContext db = new DataClasses1DataContext();
db.ObjectTrackingEnabled = false;
Address a = new Address();
a.StateProvince = db.StateProvinces.First();

Вы также можете заметить, что я убрал ваше вопиющее злоупотребление вар; -)

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