具有相同外键的多行导致外键约束错误

时间:2017-06-06 20:48:39

标签: c# sql-server winforms tsql

我有2个表,一个以Owners作为主键的MemberID表,以及一个Tigers表,其中TigerID为主键,MemberID为一个外键,表明谁拥有老虎。当然,拥有者可以拥有多只老虎。

我使用Windows窗体中的DataAdapter在DataGridView中显示老虎(Visual Studio允许您将表拖放到窗体上并自动为您生成代码)。

当我运行表单时,出现错误:

  

System.Data.ConstraintException:'无法启用约束。一行或多行包含违反非null,唯一或外键约束的值。'

编辑2:
我尝试再次删除数据,以查看是否有唯一的外键删除问题。它没有。我为早先的错误信息道歉。我也检查了MemberID中没有外键Tigers,这不是Owners中的主键

编辑:

CREATE TABLE [dbo].[Members] (
[MemberID] INT           IDENTITY (1, 1) NOT NULL,
[FName]    VARCHAR (50)  NOT NULL,
[LName]    VARCHAR (50)  NOT NULL,
[Street]   VARCHAR (MAX) NOT NULL,
[HouseNbr] INT           NOT NULL,
[PostNbr]  INT           NOT NULL,
[City]     NCHAR (10)    NOT NULL,
PRIMARY KEY CLUSTERED ([MemberID] ASC)
);


CREATE TABLE [dbo].[Tigers] (
[TigerID]  INT          IDENTITY (1, 1) NOT NULL,
[Name]     VARCHAR (50) NOT NULL,
[Type]     VARCHAR (50) NOT NULL,
[Weight]   INT          NOT NULL,
[MemberID] INT          NOT NULL,
PRIMARY KEY CLUSTERED ([TigerID] ASC)
);

编辑3 Tigers表格中的代码

        private void tigersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        this.Validate();
        this.tigersBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.tRFDDataSet);

    }

    private void frmTigerList_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'tRFDDataSet.Tigers' table. You can move, or remove it, as needed.
        this.tigersTableAdapter.Fill(this.tRFDDataSet.Tigers);

    }

编辑4:

我去了Tiger DataGrid Fill的定义并找到了这段代码:

 private TRFDDataSet tRFDDataSet;
    private System.Windows.Forms.BindingSource tigersBindingSource;
    private TRFDDataSetTableAdapters.TigersTableAdapter tigersTableAdapter;
    private TRFDDataSetTableAdapters.TableAdapterManager tableAdapterManager;
    private System.Windows.Forms.DataGridView tigersDataGridView;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn4;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn5; 

所以我在tigersBindingSource之前添加了

        private System.Windows.Forms.BindingSource membersBindingSource;
    private TRFDDataSetTableAdapters.MembersTableAdapter membersTableAdapter;

但它仍然没有奏效。错误仍然存​​在

编辑决赛:

在Tiger表代码是解决方案之前,拖放Owners表并在Form Designer代码中设置生成的代码。这是由于正确答复了解需要在同一实例中首先加载的父表。我只需要找到一种编辑方式,这样我就可以隐藏Owners表,不会以这种形式显示。

1 个答案:

答案 0 :(得分:0)

确保在Tigers表之前填写Owners表。在同一个DataSet中

要在启用约束的情况下执行此行

this.tigersTableAdapter.Fill(this.tRFDDataSet.Tigers);

this.tRFDDataSet.Owners表需要为this.tRFDDataSet.Tigers中具有MemberId的每个所有者创建一行。 这意味着您必须创建/放入OwnersTableAdapter并在填充Tigers之前调用其Fill方法