C#实体框架错误:“ SqlException:INSERT语句与FOREIGN KEY约束” FK_718“冲突

时间:2020-06-04 16:45:55

标签: c# sql-server entity-framework entity-framework-migrations

我刚开始使用Entity Framework,因此无法弄清此错误。我正在从Excel工作表中提取数据,并将其放入带有EF的数据库中。关于此问题还有其他帖子,但是经过这些帖子之后,似乎什么都没有用。

要结束我的错误声明,它说:“数据库'DataWarehouse'中的表'dbo.RVTools_vSwitch'的列'vSwitch_id'中发生了冲突。”在遵循此方法的论文线索中,我可以确认dbo.RVTools_vSwitch表中是否存在列'vSwitch_id'。 vSwitch是我的excel文件中的图纸之一,而vSwitch_id由EF自动生成。

当我尝试从其他Excel工作表vPort导入数据时,遇到了问题。 vSwitch_id是需要导入数据库的项目之一。因此,我有一个GetID函数,该函数使用excel工作表中提供的一些参数来查找正确的ID,但这仍然行不通。

我尝试的下一件事情是浏览vPort和vSwitch的类,这些类包含将数据添加到数据库中的EF调用,以及进行迁移以检查所需的所有内容是否存在,但在那里找不到任何问题。

因此,如果我具有正确的迁移,正确的类,来自excel的正确数据,并且数据库中具有正确的表和行,则什么可能导致此错误?

这是用于将数据从excel导入数据库的代码。 VSwitchId是错误所在,而vPort是我要导入的工作表:

foreach (DataRow dataRow in Data.Rows)
            {
                context.RvtoolsVPort.Add(new RvtoolsVPort
                {
                    PortGroup = dataRow[0].ToString(),
                    Vlan = Convert.ToInt32(dataRow[1]),
                    PromiscuousMode = Convert.ToBoolean(bool.Parse(dataRow[2].ToString())),
                    MacChanges = Convert.ToBoolean(bool.Parse(dataRow[3].ToString())),
                    ForgedTransmits = Convert.ToBoolean(bool.Parse(dataRow[4].ToString())),
                    TrafficShaping = Convert.ToBoolean(bool.Parse(dataRow[5].ToString())),
                    Width = Convert.ToInt32(dataRow[6]),
                    Peak = Convert.ToInt32(dataRow[7]),
                    Burst = Convert.ToInt32(dataRow[8]),
                    Policy = dataRow[9].ToString(),
                    ReversePolicy = Convert.ToBoolean(bool.Parse(dataRow[10].ToString())),
                    NotifySwitch = Convert.ToBoolean(bool.Parse(dataRow[11].ToString())),
                    RollingOrder = Convert.ToBoolean(bool.Parse(dataRow[12].ToString())),
                    Offload = Convert.ToBoolean(bool.Parse(dataRow[13].ToString())),
                    Tso = Convert.ToBoolean(bool.Parse(dataRow[14].ToString())),
                    ZeroCopyXmit = Convert.ToBoolean(bool.Parse(dataRow[15].ToString())),
                    VSwitchId = vSwitch.GetID(dataRow[19].ToString(), dataRow[16].ToString(), dataRow[18].ToString(), dataRow[17].ToString(), assessment_id),
                    AssessmentId = assessment_id
                });
                context.SaveChanges();
            }

这是vPort的类:

namespace KelderModel
{
    public partial class RvtoolsVPort
    {
        public int VPortId { get; set; }
        public string PortGroup { get; set; }
        public int? Vlan { get; set; }
        public bool? PromiscuousMode { get; set; }
        public bool? MacChanges { get; set; }
        public bool? ForgedTransmits { get; set; }
        public bool? TrafficShaping { get; set; }
        public int? Width { get; set; }
        public int? Peak { get; set; }
        public int? Burst { get; set; }
        public string Policy { get; set; }
        public bool? ReversePolicy { get; set; }
        public bool? NotifySwitch { get; set; }
        public bool? RollingOrder { get; set; }
        public bool? Offload { get; set; }
        public bool? Tso { get; set; }
        public bool? ZeroCopyXmit { get; set; }
        public int VSwitchId { get; set; }
        public int AssessmentId { get; set; }
        public virtual Assessment Assessment { get; set; }
        public virtual RvtoolsVSwitch VSwitch { get; set; }
       }
 }

最后,这是我迁移vPort的代码:

migrationBuilder.CreateTable(
            name: "RVTools_vPort",
            columns: table => new
            {
                vPort_id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                port_group = table.Column<string>(unicode: false, maxLength: 255, nullable: true),
                vlan = table.Column<int>(nullable: true),
                promiscuous_mode = table.Column<bool>(nullable: true),
                MAC_changes = table.Column<bool>(nullable: true),
                forged_transmits = table.Column<bool>(nullable: true),
                traffic_shaping = table.Column<bool>(nullable: true),
                width = table.Column<int>(nullable: true),
                peak = table.Column<int>(nullable: true),
                burst = table.Column<int>(nullable: true),
                policy = table.Column<string>(unicode: false, maxLength: 255, nullable: true),
                reverse_policy = table.Column<bool>(nullable: true),
                notify_switch = table.Column<bool>(nullable: true),
                rolling_order = table.Column<bool>(nullable: true),
                offload = table.Column<bool>(nullable: true),
                TSO = table.Column<bool>(nullable: true),
                zero_copy_xmit = table.Column<bool>(nullable: true),
                vSwitch_id = table.Column<int>(nullable: false),
                assessment_id = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_RVTools_vPort", x => x.vPort_id);
                table.ForeignKey(
                    name: "FK_849",
                    column: x => x.assessment_id,
                    principalTable: "Assessment",
                    principalColumn: "assessment_id",
                    onDelete: ReferentialAction.Cascade);
                table.ForeignKey(
                    name: "FK_718",
                    column: x => x.vSwitch_id,
                    principalTable: "RVTools_vSwitch",
                    principalColumn: "vSwitch_id",
                    onDelete: ReferentialAction.Restrict);
            });

在迁移中是否存在一些约束条件问题?谢谢您可能带来的帮助。

0 个答案:

没有答案
相关问题