InsertOnSubmit не прикрепляется? - PullRequest
3 голосов
/ 03 марта 2010

После создания нового объекта (Foo) я установил ключ (BarId) для свойства ассоциации EntityRef (Bar). Затем я хочу вставить новый объект в базу данных и получить доступ к загруженному потомку дочернему объекту.

К сожалению, свойство отложенной загрузки возвращает нуль после вызова InsertOnSubmit (). Однако он возвращает правильный объект, если я вместо этого прикрепляю () объект к контексту данных.

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

var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo> ().InsertOnSubmit( foo );
foo.Bar.Something();    // throws NullReferenceException

Здесь объект Bar загружен правильно:

var foo = new Foo();
foo.BarId = 123;
context.GetTable<Foo> ().Attach( foo );
foo.Bar.Something();    // method is called on lazy-loaded Bar object

Вызов Attach перед InsertOnSubmit заставляет последнего генерировать исключение «Невозможно добавить сущность, которая уже существует».

Итак, это ошибка в LINQ-to-SQL, когда вставленные объекты неправильно привязаны к контексту данных?

Как мне это исправить?

1 Ответ

3 голосов
/ 03 марта 2010

Я бы установил свойство Bar вместо свойства BarId вашего класса Foo. На мой взгляд, что Linq-to-sql делает неправильно, так это свойство BarId. Это не добавляет никакой ценности и идет вразрез с основными принципами ООП. Итак, я бы изменил ваш код на что-то вроде этого:

var foo = new Foo();
foo.Bar = //get bar with id: 123;
context.GetTable<Foo> ().InsertOnSubmit(foo);
foo.Bar.Something();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...