Исключение возникает после удаления строки из строго типизированного DataSet?

Я использую .NET 4.0 и SQL Server 2008 R2.

У меня есть три таблицы:

Companies (PK CompanyID) 
Addresses (PK AddressID, FK CompanyID) 
ContactPersons (PK ContactPersonID, FK CompanyID)

CompanyID назначается пользователями вручную. Остальные идентификаторы генерируются автоматически. Компании имеют отношения «один ко многим» с ContactPerson. Я установил любые изменения в каскад.

Я отображаю все записи в компаниях в DataGridView, и при щелчке строки соответствующие записи в ContactPersons отображаются во втором DataGridView.

Затем я удаляю строку из таблицы ContactPersons с помощью:

DataRow row = m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Find(this.m_CurrentContactPerson.ContactPersonID);
row.Delete();

И когда я пытаюсь запросить таблицу, чтобы создать источник данных для заполнения DataGridView:

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons
                              where row.CompanyID == companyID
                              select new
                              {
                                 ContactPersonID = row.ContactPersonID,
                                 CompanyID = row.CompanyID,
                                 NameFirst = row.NameFirst,
                                 NameLast = row.NameLast,
                                 PhoneNumber = row.PhoneNumber,
                                 EmailAddress = row.EmailAddress,
                                 Position = row.Position
                              };

Я получаю исключение DeletedRowInaccessibleException. Любые идеи, что я делаю неправильно здесь?

На самом деле исключение исходит из этого автоматически сгенерированного кода для типизированного DataSet:

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public int CompanyID {
                get {
                    try {
                        return ((int)(this[this.tableContactPersons.CompanyIDColumn])); // <<<--- DeletedRowInaccessibleException
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("The value for column \'CompanyID\' in table \'ContactPersons\' is DBNull.", e);
                    }
                }

person Zingam    schedule 23.06.2012    source источник


Ответы (1)


Я понял это вскоре после написания вышеуказанного вопроса (хотя на это у меня ушло больше дня):

var dataRows_ContactPersons = from row in this.m_SoldaCompaniesFileDataSet.ContactPersons
                              where row.RowState != DataRowState.Deleted && row.CompanyID == companyID
                              select new
                              {
                                   ContactPersonID = row.ContactPersonID,
                                   CompanyID = row.CompanyID,
                                   NameFirst = row.NameFirst,
                                   NameLast = row.NameLast,
                                   PhoneNumber = row.PhoneNumber,
                                   EmailAddress = row.EmailAddress,
                                   Position = row.Position
                              };

Необходимо исключить удаленные строки из запроса Linq, выполнив эту проверку:

row.RowState != DataRowState.Deleted
person Zingam    schedule 25.06.2012