3

私は linq、Ajax、および c# の初心者です。私は SQL Server または VB を初めて使用するわけではありません。エラーが発生しています:

'ReportTypeID' is not a foreign key column and cannot be used here.

はい、http://forums.asp.net/t/1254559.aspxを見て、エラーの 1 つを見つけました。

いいえ、私はビューを使用していないので、「... は外部キー列ではなく、ここでは使用できませんか?」 はほとんど役に立ちませんでした。

私の知る限り、外部キーを処理するように正しく構成されています。

2 つのテーブルは次のように構成されます。

CREATE TABLE [dbo].[Report](
    [Id] [INT] IDENTITY(1,1) NOT NULL,
    [ReportTypeID] [INT] NOT NULL,
 CONSTRAINT [PK_Report] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Report] ADD CONSTRAINT [DF_Report_ReportTypeID]  DEFAULT ((1)) FOR [ReportTypeID]
GO
ALTER TABLE [dbo].[Report]  WITH CHECK ADD  CONSTRAINT [FK_Report_ReportType] FOREIGN KEY([ReportTypeID])
REFERENCES [dbo].[ReportType] ([TypeValue])
GO
ALTER TABLE [dbo].[Report] CHECK CONSTRAINT [FK_Report_ReportType]
GO
CREATE TABLE [dbo].[ReportType](
    [TypeValue] [INT] NOT NULL,
    [TypeDescr] [VARCHAR](50) NOT NULL,
 CONSTRAINT [PK_ReportType] PRIMARY KEY CLUSTERED
(
    [TypeValue] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SQL 結合は次のとおりです。

SELECT * FROM Report r INNER JOIN ReportType rt ON r.ReportTypeID = rt.TypeValue

最後に、適切な列の C# dbml 定義 (かなり簡略化されています) は次のとおりです。

<Table Name="dbo.Report" Member="Reports">
  <Type Name="Report">
    <Column Name="ReportTypeID" Type="System.Int32" DbType="INT NOT NULL" CanBeNull="false" />
    <Association Name="ReportType_Report" Member="ReportType" ThisKey="ReportTypeID" OtherKey="TypeValue" Type="ReportType" IsForeignKey="true" />
  </Type>
</Table>
<Table Name="dbo.ReportType" Member="ReportTypes">
  <Type Name="ReportType">
    <Column Name="TypeValue" Type="System.Int32" DbType="INT NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
    <Association Name="ReportType_Report" Member="Reports" ThisKey="TypeValue" OtherKey="ReportTypeID" Type="Report" />
  </Type>
</Table>

SQL は正しく機能し、データに分離はありません。プログラムをステップ実行すると、データは正しくなります。有効な ReportTypeID=1 の値。ReportType テーブルの TypeValue は自動生成されず、一意で主キーです。これは dbml 定義と関係があると思われます。私はまだ何かが確実に欠けています。 編集:ビジュアル リレーションを追加します。設定は、機能する画像の他の関係に基づいています。表の視覚的関係

エラーは、Ajax フィールド テンプレート コード "ForeignKeyRequired_Edit.ascx.cs" で報告されます。

protected override void OnDataBinding(EventArgs e)
{
  base.OnDataBinding(e);

  if (Mode == DataBoundControlMode.Edit)
  {
    string foreignkey = ForeignKeyColumn.GetForeignKeyString(Row); // Error On This Line
    ListItem item = DropDownList1.Items.FindByValue(foreignkey);
    if (item != null)
    {
      DropDownList1.SelectedValue = foreignkey;
    }
  }
}


編集私は問題を見つけたと思います。答えを見つけるにはいくつかのドキュメントが必要です。コード内に、編集が必要な switch ステートメントがあります。テンプレートには到達していますが、フィールドには到達していません。

case "Source": // This Works
  items = StaticCache.Sources.AsQueryable().Where(att.WhereClause).Select(r => new ListItem { Text = r.Name, Value = r.Id.ToString() }).ToArray();
  break;
// Problem Code - This One Doesn't - Not Sure Which Of These To Use
case "ReportTypeTable": // Based On The Table Definition -- Internal Doc Points To This One
  items = StaticCache.ReportTypes.AsQueryable().Where(att.WhereClause).Select(r => new ListItem { Text = r.TypeDescr, Value = r.TypeValue.ToString() }).ToArray();
  break;


編集
「ReportType」テーブルは、SQL Server によって「無効なオブジェクト」と見なされます。これが問題でしょうか?
編集
私は現在、考えられる問題としてアクティブディレクトリを調べています。編集アクティブディレクトリの問題ではなく、「無効なオブジェクト」エラーはインテルセンスの問題でした(修正済み)。

編集:答えの一部があります。ドキュメントは明確ではありません。答えは、テーブルの dbml 定義にあります。幸いなことに、そのテーブルの各レベルの名前を変更して、定義内の「ID」の各レベルへの参照が一意であるが関連する名前を持つようにしました。部分的な答えは、dbml テーブル名を使用することです。このエラーは発生しなくなりました。ドロップダウンリストにデータがありません。参照: http://www.seekwaytech.com/2011/02/27/asp-net-4-0-dynamic-data-foreign-keys-show-up-in-a-text-box/およびhttp:/ /forums.asp.net/t/1254559.aspx の順序で。(最初は2番目への答えを説明します)

編集最後に、すべてのガベージ テストを取り除き、動的オブジェクトに戻ることで作業が完了しました。

<asp:DynamicControl runat="server" DataField="ReportTypeTable" DataValueField="TypeValue" DataTextField="TypeDescr" Mode="Edit" UIHint="ForeignKeyRequired" CssClass="general" /> 
4

2 に答える 2

1

私の推測では、これはあなたの問題です...

 <Association Name="ReportType_Report" Member="Reports" ThisKey="TypeValue" OtherKey="ReportTypeID" Type="Report" />

ReportType は Report テーブルを参照しておらず、その逆ですが、両方を定義しています。

この関連付けを終了して、機能するかどうかを確認してください。

于 2013-01-19T00:43:40.407 に答える
0

ドキュメントは明確ではありません。答えは、テーブルの DBML 定義にあります。幸いなことに、そのテーブルの各レベルの名前を変更して、定義内の「ID」の各レベルへの参照が一意であるが関連する名前を持つようにしました。部分的な答えは、DBML テーブル名を使用することです。このエラーは発生しなくなりました。ドロップダウンリストにデータがありません。参照: http://www.seekwaytech.com/2011/02/27/asp-net-4-0-dynamic-data-foreign-keys-show-up-in-a-text-box/およびhttp:/ /forums.asp.net/t/1254559.aspx の順序で。(最初は2番目への答えを説明します)

最後に、オブジェクトの元の定義に戻り、「DataValueField」と「DataTextField」をコントロールに追加しました。必要に応じて機能するようになりました。

<asp:DynamicControl runat="server" DataField="ReportTypeTable" DataValueField="TypeValue" DataTextField="TypeDescr" Mode="Edit" UIHint="ForeignKeyRequired" CssClass="general" /> 
于 2013-01-29T23:34:13.807 に答える