2010-01-08 3 views
1

У меня есть стандартное обновление, выполняемое через linq to sql, но данные не сохраняются в базе данных.Обновление Linq to Sql, не сохраняющееся в базе данных

Я использую автогенерируемый класс с помощью конструктора файлов .dbml.

Оператор обновления ниже:

public static void UpdateEmailsInWorkingTable(Guid emailGuid, string modifiedEmail) 
{ 
     using (EmailDBDataContext DBContext = new EmailDBDataContext()) 
     { 
      EmailAddress_Update EAUpdated = (from e in DBContext.EmailAddress_Updates 
              where e.EmailGuid == emailGuid 
              select e).SingleOrDefault(); 

      EAUpdated.EmailAddress = modifiedEmail; 
      EAUpdated.IsValid = 'Y'; 
      EAUpdated.UpdateFlag = true; 
      EAUpdated.LastChangedDtTm = DateTime.Now; 
      try 
      { 
       DBContext.SubmitChanges(ConflictMode.FailOnFirstConflict); 
      } 
      catch (ChangeConflictException ex) 
      { 
       // do stuff here 
      } 
     } 
} 

Я просмотрел мой автоматически генерируемой DataContext класса и только вопиющая разница в том, что таблица в вопросе EmailAddress_Update не реализует два интерфейса INotifyPropertyChanging и INotifyPropertyChanged, что другой автоматически создаваемые сущности.

Я предполагаю, что это причина того, почему изменения не сохраняются, не так ли?

Проще говоря, ни один из методов расширяемости Определения не генерируются для любой части этого одного класса. Если это является причиной моих проблем, что в базе данных будет причиной того, что это не будет автоматически генерироваться?

Благодаря ~

+3

В вашем блоке catch catch используется метод EmailDBContext, который должен быть DBContext? –

+0

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

+0

Если вы вызываете 'SingleOrDefault', вы лучше справляетесь с тем, что' EAUpdated' может быть нулевым указателем. Если вы не хотите обрабатывать нулевой регистр, вы должны просто называть 'Single'. –

ответ

2

Я отвечал на этот вопрос на MSDN, а здесь: MSDN Linq to Sql если вы хотите, чтобы увидеть ответы. Но я нашел часть причины, по которой код не генерируется.

Вот отрывок из моего MSDN ответа:

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

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

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

0

Хорошо, поэтому, чтобы ответить на мой собственный вопрос «Мой вопрос теперь в том, почему должен быть первичный ключ для этого материала, чтобы автоматически генерировать?» Я нашел его в книге Pro LINQ, написанной Джо Джозеф C. Rattz, младший

Я читал, как обращаться с видом в сравнении таблиц и он говорит, что это:

«Поскольку классы сущностей, создаваемые для представлений не содержат свойства класса сущности, которые отображаются в качестве первичных ключей, они доступны только для чтения. Если вы считаете, что без первичных ключей DataContext не имеет эффективного способа обеспечить отслеживание идентификации, это имеет смысл ».

Тайна и проблема решена.