2012-12-06 17 views
1

我用Linq to SQL将我的数据库映射到基础对象。我将所有的表拖入我的dbml中,并且它们都很好地设置。我保存的dbml并创建表示表的类等Linq制作主键system.nullable <int>不只是int

在我的数据库我有一个表这样:

CREATE TABLE [dbo].[BidNames](
    [BidNameID] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerID] [int] NOT NULL, 
    [BidName] [varchar](75) NOT NULL, 
CONSTRAINT [PK_BidNames] PRIMARY KEY CLUSTERED 
(
    [BidNameID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

的BidNameID领域显然是一个主键,显然NOT NULL。然而,Linq定义BidNameID是这样的:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BidNameID", DbType="Int")] 
    public System.Nullable<int> BidNameID 
    { 
     get 
     { 
      return this._BidNameID; 
     } 
     set 
     { 
      if ((this._BidNameID != value)) 
      { 
       if (this._BidName1.HasLoadedOrAssignedValue) 
       { 
        throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException(); 
       } 
       this.OnBidNameIDChanging(value); 
       this.SendPropertyChanging(); 
       this._BidNameID = value; 
       this.SendPropertyChanged("BidNameID"); 
       this.OnBidNameIDChanged(); 
      } 
     } 
    } 

其中BidNameID被定义为System.Nullable。我的数据库中的所有其他表都可以正确解析,所以我还想知道为什么会发生这种情况。有任何想法吗?

在此先感谢。

编辑

我发现这个问题与另一个表有关。如果我从我的dbml中删除Bids表并重新保存,则BidNameID列正确解析为int。如果我将Bids表放回并保存,则返回Nullable。投标表在BidNames表中有一个外键,但数据是干净的。这里是投标表的结构:我把你的表脚本

CREATE TABLE [dbo].[Bids](
    [BidID] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerID] [int] NOT NULL, 
    [ItemID] [int] NOT NULL, 
    [Amount] [money] NOT NULL, 
    [BidName] [varchar](75) NOT NULL, 
    [BidTime] [datetime] NOT NULL, 
    [BidNameID] [int] NULL, 
CONSTRAINT [PK_Bids] PRIMARY KEY CLUSTERED 
(
    [BidID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[Bids] WITH CHECK ADD CONSTRAINT [FK_Bids_BidNames] FOREIGN KEY([BidNameID]) 
REFERENCES [dbo].[BidNames] ([BidNameID]) 
GO 

ALTER TABLE [dbo].[Bids] CHECK CONSTRAINT [FK_Bids_BidNames] 
GO 

ALTER TABLE [dbo].[Bids] WITH CHECK ADD CONSTRAINT [FK_Bids_Customers] FOREIGN KEY([CustomerID]) 
REFERENCES [dbo].[Customers] ([CustomerID]) 
GO 

ALTER TABLE [dbo].[Bids] CHECK CONSTRAINT [FK_Bids_Customers] 
GO 

ALTER TABLE [dbo].[Bids] WITH CHECK ADD CONSTRAINT [FK_Bids_Items] FOREIGN KEY([ItemID]) 
REFERENCES [dbo].[Items] ([ItemID]) 
GO 

ALTER TABLE [dbo].[Bids] CHECK CONSTRAINT [FK_Bids_Items] 
GO 
+0

连接字符串匹配吗?也许尝试删除/重新创建dbml中的表?我会认为DBType是INT NOT NULL。 – mcknz

+0

是的,我检查了几次,连接字符串是正确的。我还删除了一个表并将其拖回到dbml,并再次将主键视为可为空。 – BKahuna

回答

0

我不一定理解为什么,但当我改变投标表并使BidNameID字段不为NULL,它解决了BidName.BidNameID字段的问题。它现在解析为int而不是空值。

0

,跑在我的数据库,并把它拖成DBML,并没有产生可为空(VS2010,VB.NET 4.0):

<Global.System.Data.Linq.Mapping.ColumnAttribute(
    Storage:="_BidNameID", AutoSync:=AutoSync.OnInsert, 
    DbType:="Int NOT NULL IDENTITY", IsPrimaryKey:=True, 
    IsDbGenerated:=True)> 
    Public Property BidNameID() As Integer 
     Get 
      Return Me._BidNameID 
     End Get 
     Set(value As Integer) 
      If ((Me._BidNameID = value) _ 
       = False) Then 
       Me.OnBidNameIDChanging(value) 
       Me.SendPropertyChanging() 
       Me._BidNameID = value 
       Me.SendPropertyChanged("BidNameID") 
       Me.OnBidNameIDChanged() 
      End If 
     End Set 
    End Property 

也许试试其中的一个或多个?

  1. 滴/重建物理表
  2. 删除/重建在服务器资源管理器的数据库连接
  3. 删除/重新创建DBML
  4. 手动编辑设计文件
  5. 创建额外的datacontext部分类和手动保持该表/映射
+0

我试着删除/重新创建和清除dbml并拖动新表,但问题仍然存在。我确实发现了与另一张桌子的关系,并将其作为编辑添加到原始帖子中。 – BKahuna