Linq to sql 在重新创建Linq to SQL dbml(或可能在移动到.NET 3.5 SP1之后)后创建匿名类型时出现异常

Linq to sql 在重新创建Linq to SQL dbml(或可能在移动到.NET 3.5 SP1之后)后创建匿名类型时出现异常,linq-to-sql,.net-3.5,Linq To Sql,.net 3.5,我们将.dbml文件移出了网站,并移到了另一个程序集中,这样它就可以在多个应用程序之间共享。问题是,现在我遇到了一个毫无意义的错误 基本查询如下所示: from D in Devices select new { EquipmentTypeID = D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID, //... more fields } 有几个字段是这样查询的,现在它们都抛出了以下异常:不能将null值分配给类型为Syst

我们将.dbml文件移出了网站,并移到了另一个程序集中,这样它就可以在多个应用程序之间共享。问题是,现在我遇到了一个毫无意义的错误

基本查询如下所示:

from D in Devices
select new
{
    EquipmentTypeID = D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID,
    //... more fields
}
有几个字段是这样查询的,现在它们都抛出了以下异常:不能将null值分配给类型为System.Int32的成员,该类型是不可为null的值类型

所讨论的ID字段在数据库或Linq实体类中不可为null。所有内容都正确匹配,因此其中的任何位置都不应为null值。在将.dbml文件“移动”到另一个程序集之前,代码也工作得很好

实际上,我们没有移动它,因为在尝试时出现了一些其他错误和问题。我在新程序集中重新创建了它,但这不重要,因为它是从同一个数据库生成的

我还尝试选择了D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID为null且未返回任何结果的任何内容

编辑:根据请求,这里是dbml文件的xml。或者至少是相关部分:

<Table Name="dbo.DMXDevice" Member="DMXDevices">
  <Type Name="DMXDevice">
    <Column Name="ID" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
    <Column Name="DeviceModelID" Type="System.Int32" DbType="Int" CanBeNull="true" />    
    <Association Name="DMXDeviceModel_DMXDevice" Member="DMXDeviceModel" ThisKey="DeviceModelID" OtherKey="ID" Type="DMXDeviceModel" IsForeignKey="true" />    
  </Type>
</Table>

  <Table Name="dbo.DMXDeviceModel" Member="DMXDeviceModels">
    <Type Name="DMXDeviceModel">
      <Column Name="ID" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
      <Column Name="DeviceClassID" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
      <Column Name="Model" Type="System.String" DbType="NVarChar(255) NOT NULL" CanBeNull="false" />      
    </Type>
  </Table>

事实证明,当DeviceModelID为null时,通过DMXDeviceModel引用的任何内容都会引发此异常。创建匿名类型以处理null DeviceModelID似乎是个问题……但为什么以前没有发生这种情况


编辑:你知道,我也迁移到了.NET 3.5 SP1,这改变了网站上的一些其他行为。也许这才是真正的罪魁祸首。

答案是将表达式强制转换为可为null的类型,这让匿名类型知道它会发生什么。我怀疑这是SP1的一个变化

EquipmentTypeID = ((int?)D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID),

看到.dbml映射XML的可能性有多大?如果发布,请记住删除连接节点:)我发现,DeviceModelID列可以为null。。。我认为它在创建匿名类型时抛出了null引用异常。问题是为什么会出现此错误而不是空引用异常?不,不用担心。列应该是可空的,并且在移动之前是这样工作的…很难说看到更多的查询被破坏了。废话。。。stackoverflow似乎不喜欢xml。它在第一行之后被切断。另外,发现“as”不起作用:“EquipmentTypeID=D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID as int?”。你必须像Telos说的那样使用cast操作符。