我是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,发现了我的一个错误。
不,我没有使用视图,因此“...is not a foreign key column and cannot be used here?”没什么用处。
据我所知,它已正确配置为处理外键。
这两个表的配置如下:
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 以该顺序。 (第一个解释了第二个答案)
编辑最后,摆脱所有垃圾测试并返回动态对象完成了这项工作。
<asp:DynamicControl runat="server" DataField="ReportTypeTable" DataValueField="TypeValue" DataTextField="TypeDescr" Mode="Edit" UIHint="ForeignKeyRequired" CssClass="general" />
答案 0 :(得分:1)
我的猜测是你的问题......
<Association Name="ReportType_Report" Member="Reports" ThisKey="TypeValue" OtherKey="ReportTypeID" Type="Report" />
ReportType没有引用Report表,反之亦然,但你已经定义了它们。
终止此关联,看看它是否有效。
答案 1 :(得分: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" />