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テーブルへの外部キーがありますが、データはクリーンです。Bidsテーブルの構造は次のとおりです。

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

理由は必ずしもわかりませんが、Bidsテーブルを変更してBidNameIDフィールドをNOT NULLにすると、BidName.BidNameIDフィールドの問題が修正されます。null許容型ではなくint型に解決されるようになりました。

于 2012-12-07T16:58:54.767 に答える
0

私はあなたのテーブルスクリプトを取り、私のDBで実行し、それをdbmlにドラッグしましたが、null許容として生成されませんでした(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つ以上を試してみてください?

  1. 物理テーブルをドロップ/再作成します
  2. サーバーエクスプローラーでDB接続を削除/再作成します
  3. dbmlを削除/再作成します
  4. デザイナーファイルを手動で編集する
  5. 追加のdatacontext部分クラスを作成し、そのテーブル/マッピングを手動で維持します
于 2012-12-06T07:11:27.827 に答える