Получение странного исключения при создании анонимного типа после воссоздания Linq для SQL dbml (или, возможно, после перехода на .NET 3.5 SP1 - PullRequest
2 голосов
/ 16 января 2009

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

Основной запрос выглядит так:

from D in Devices
select new
{
    EquipmentTypeID = D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID,
    //... more fields
}

Есть несколько полей, запрошенных подобным образом, и теперь все они выдают следующее исключение: Нулевое значение не может быть присвоено элементу с типом System.Int32, который является необнуляемым типом значения.

Указанные поля идентификаторов не могут быть обнулены в базе данных или в классе сущностей Linq. Все совпадает правильно, поэтому нигде не должно быть нулевого значения. Код также отлично работал до «перемещения» файла .dbml в другую сборку.

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

Я также пытался выбрать что-нибудь, где D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID имеет значение NULL, и результаты не были возвращены.

РЕДАКТИРОВАТЬ: по запросу здесь xml для файла dbml. Или хотя бы соответствующие порции:

<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>

Оказывается, все, на что ссылается DMXDeviceModel, выдает это исключение, когда DeviceModelID имеет значение null. Кажется, это проблема при создании анонимного типа для обработки нулевого DeviceModelID ... но почему этого не происходило раньше?

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Вы знаете, я также перешел на .NET 3.5 SP1, и это изменило некоторые другие поведения на сайте. Может быть, это настоящий виновник здесь.

1 Ответ

3 голосов
/ 16 января 2009

Ответ заключается в приведении выражения к обнуляемому типу, что позволяет анонимному типу ожидать его. Я подозреваю, что это было изменение с SP1.

EquipmentTypeID = ((int?)D.DMXDeviceModel.DMXDeviceClass.DMXEquipmentType.ID),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...