使用bit / booleans的LINQ to SQL问题

时间:2009-12-04 16:47:10

标签: c# sql-server linq-to-sql

我遇到LINQ2Sql的问题,数据库中的值无法正确访问我的代码。除了在数据库中定义为位字段的列外,一切正常。在LINQ查询之后的代码中,位字段的值始终为false。到底是怎么回事?

我已经尝试从SQL设计器中删除该表,然后将其重新添加,但这没有什么区别。

我查看SQL Server Mgmt Studio中的表数据,并且我的位列的值是正确的:1表示true,0表示false。如果我在Mgmt Studio中编辑表,它在正确的位置有True / False。如果我在LINQ Pad中运行我的查询,它将返回正确的值。如果我进入调试器并从LINQ结果中获取SQL,那么当我运行它时,我得到了正确的结果!

这是我的LINQ代码......

        var theplan = (from plans in _data.Plans
                       where plans.PlanId.ToString() == sId
                       select plans).FirstOrDefault();

以下是我的表格定义......

CREATE TABLE [dbo].[Things](
    [ThingId] [uniqueidentifier] NOT NULL,
    [ValidEnvelope] [bit] NOT NULL,
    [Xmax] [float] NOT NULL,
    [Xmin] [float] NOT NULL,
    [Ymax] [float] NOT NULL,
    [Ymin] [float] NOT NULL,
    [IsValid] [bit] NOT NULL,
 CONSTRAINT [PK_Things] PRIMARY KEY CLUSTERED .... etc.

CREATE TABLE [dbo].[Plans](
    [PlanId] [uniqueidentifier] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [Created] [datetime] NOT NULL,
    [Modified] [datetime] NOT NULL,
    [ThingId] [uniqueidentifier] NOT NULL,
    [ViewStateId] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_plans] PRIMARY KEY CLUSTERED ... etc.

不是Plans.ThingId列指向Things.ThingId为FK。问题列是Things.ValidEnvelope和Things.IsValid。

这是dbml文件中的XML ....

<?xml version="1.0" encoding="utf-8"?>
<Database Name="XXXX" Class="XXXXDbDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
  <Connection Mode="AppSettings" ConnectionString="......" .... />
  <Table Name="dbo.ViewStates" Member="ViewStates">
    <Type Name="ViewState">
      <Column Name="ViewStateId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
      <Column Name="Xmax" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Xmin" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Ymax" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Ymin" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Association Name="ViewState_Plan" Member="Plans" ThisKey="ViewStateId" OtherKey="ViewStateId" Type="Plan" />
    </Type>
  </Table>
  <Table Name="dbo.Plans" Member="Plans">
    <Type Name="Plan">
      <Column Name="PlanId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
      <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" />
      <Column Name="Created" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
      <Column Name="Modified" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
      <Column Name="ThingId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
      <Column Name="ViewStateId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
      <Association Name="ViewState_Plan" Member="ViewState" ThisKey="ViewStateId" OtherKey="ViewStateId" Type="ViewState" IsForeignKey="true" />
      <Association Name="Thing_Plan" Member="Thing" ThisKey="ThingId" OtherKey="ThingId" Type="Thing" IsForeignKey="true" />
    </Type>
  </Table>
  <Table Name="dbo.Things" Member="Things">
    <Type Name="Thing">
      <Column Name="ThingId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
      <Column Name="ValidEnvelope" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
      <Column Name="Xmax" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Xmin" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Ymax" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="Ymin" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
      <Column Name="IsValid" Type="System.Boolean" DbType="Bit NOT NULL" CanBeNull="false" />
      <Association Name="Thing_Plan" Member="Plans" ThisKey="ThingId" OtherKey="ThingId" Type="Plan" />
    </Type>
  </Table>
</Database>

2 个答案:

答案 0 :(得分:1)

运行SQL Server Profiler,检查正在生成的确切查询,复制该确切查询,然后在Management Studio中运行它。

该程序肯定会产生相同的结果。我认为你会发现,甚至在那么远之前,你可能根本就没有看到查询。它可能会在途中缓存,或者您在项目中连接的数据库可能不是您认为的那个(检查dbml-properties中正在使用哪个连接字符串,然后在项目中检查该字符串)设置,并检查web.config中的潜在覆盖

答案 1 :(得分:0)

在代码的另一部分中发现了问题。愚蠢的错误。