我正在使用.NET 4.0和SQL Server 2008 R2。
我有三张桌子:
Companies (PK CompanyID)
Addresses (PK AddressID, FK CompanyID)
ContactPersons (PK ContactPersonID, FK CompanyID)
公司 ID 由用户手动分配。其他 ID 是自动生成的。公司与联系人有一对多关系。我已将任何更改设置为级联。
我在 DataGridView 中显示公司中的所有记录,当单击一行时,联系人中的相应记录将显示在第二个 DataGridView 中。
然后我从表中删除一行联系人:
DataRow row = m_SoldaCompaniesFileDataSet.ContactPersons.Rows.Find(this.m_CurrentContactPerson.ContactPersonID);
row.Delete();
当我尝试查询表以创建数据源以填充数据网格视图时:
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
};
我收到已删除行无法访问异常。知道我在这里做错了什么吗?
实际上,异常来自类型化数据集的自动生成的代码:
[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);
}
}
我在写完上述问题后不久就想通了(尽管我总共花了一天多的时间):
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