1

我正在使用 Linq to SQL 将我的数据库映射到基础对象。我将所有表拖到我的 dbml 中,它们都设置得很好。我保存 dbml 并创建代表表的类等。

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

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 字段显然是一个主键,显然不是 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。Bids 表在 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
4

2 回答 2

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. 创建额外的数据上下文部分类并手动维护该表/映射
于 2012-12-06T07:11:27.827 回答
0

我不一定明白为什么,但是当我更改 Bids 表并使 BidNameID 字段不为 NULL 时,它解决了 BidName.BidNameID 字段的问题。它现在解析为 int 而不是可为空的。

于 2012-12-07T16:58:54.767 回答