Запрет на вставку после создания нового объекта Linq-to-SQL - PullRequest
1 голос
/ 12 февраля 2011

В моем приложении я создаю новый объект Linq-to-SQL и передаю его (с некоторым назначенным значением) в окно WinForms, чтобы пользователь мог заполнить все остальное.

Если пользователь отменяет форму, я не хочу, чтобы данные были вставлены.

Проблема в том, что при следующем вызове SubmitChanges запись все еще вставляется.

Есть ли простой способ предотвратить это? Я не хочу создавать отдельный класс с такими же полями, как у класса Linq-to-SQL, когда у меня уже есть все необходимые поля.

Я нашел эту статью http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx,, но она, похоже, решает другую проблему и не кажется простым решением.

Обновление: Я смог воспроизвести поведение в консольном приложении. Вот код, который я использовал (с разными именами, такими как Клиент и Страна):

MyDatabase db = new MyDataBase(@"Data Source:d:\test.sdf");
Customer customer = new Customer();
customer.Name = "customer 1";
customer.Country = db.Country.FirstOrDefault();

db.SubmitChanges();

Вставка произошла, как только я добавил строку назначения "Страна". Данные по странам в этом примере хранятся в другой таблице.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Запись не будет вставлена, если вы не позвоните InsertOnSubmit, или она не будет прикреплена к вашему текстовому тексту иным образом.

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

Возможно, вы могли бы опубликовать некоторый код, в частности, где вы создаете объект.

edit: кажется, что ваш клиентприкрепляется к текстовому тексту данных, когда вы присваиваете ему db.Country.FirstOrDefault().Эти отношения EntityRef / EntitySet являются двухсторонними - когда вы присваиваете customer.Country = db.Country.FirstOrDefault(), вы также фактически произносите db.Country.FirstOrDefault().Customers.Add(customer), что добавляет клиента к текстовому тексту в качестве нового объекта.Затем, когда вы позвоните по номеру SubmitChanges, клиент будет вставлен.

Наилучший подход состоит в том, чтобы (а) держать клиента отдельно от страны до тех пор, пока вы не отправите заявку, затем записать, или (б) утилизироватьтекстового контекста, если пользователь отменяет / не может отправить, а затем создать новый контекст.Эти подходы определенно будут работать и являются лучшим шаблоном, чем у вас есть в настоящее время.

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

  • Откройте базу данных в Visual Studio
  • Выберите отношение между клиентом и страной, а затем просмотрите Свойства
  • Вы увидите собственность для ребенка и родителя отношений.В разделе «Дочерний» вы хотите установить для «ChildProperty» (или это может быть «IsChildProperty») значение false.

При этом удаляется свойство Customers объекта Country, и это будет означать, что вы можете установить страну так, как вы делаете, без каких-либо побочных эффектов;т.е. он не будет косвенно ассоциировать Клиента со Страной.Это означает, что у объекта Country больше нет «Клиентов», и поэтому вы не можете случайно присоединить Клиента к стране.Дайте мне знать, если это работает для вас!

0 голосов
/ 12 февраля 2011

когда пользователь отменяет форму, вы можете удалить объект datacontext. когда пользователь снова откроет форму, вы создаете новый текстовый текст.

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