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并发现了我的一个错误。

不,我没有使用视图,所以“ ...不是外键列,不能在这里使用? ”没什么用。

据我所知,它已正确配置为处理外键。

两张表配置如下:

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;


编辑
SQL Server 将“ReportType”表视为“无效对象”。这可能是问题吗?
编辑
我现在正在调查活动目录作为一个可能的问题。编辑不是活动目录问题,“无效对象”错误是智能感知问题(已修复)。

编辑:我有部分答案。文档不清楚。答案在于表的 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 按此 顺序。(第一个解释第二个的答案)

编辑最后,摆脱所有垃圾测试并返回动态对象完成了这项工作。

<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 按此 顺序。(第一个解释第二个的答案)

最后,我回到对象的原始定义,将“DataValueField”和“DataTextField”添加到控件中。它现在可以根据需要工作。

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