存在主键值时的EF6“外键约束违规”

时间:2018-09-11 19:09:39

标签: c# .net entity-framework entity-framework-6

我正在遵循EF6的多重视觉课程。 (我知道,我知道。我很慢。向我起诉。)

我有一个Clans表,该表中预先填充了以下值:

ID    Name
--    --------------
1     Vermont Ninjas

ID是主键列。同样,我有一个Ninjas表,其中ClanId作为Clans表的外键。在我的应用程序中,我有以下代码:

private static void InsertNinja()
{
    var ninja = new Ninja
                    {
                        Name = "JulieSan",
                        ServedInOniwaban = false,
                        DateOfBirth = new DateTime(1980, 1, 1),
                        ClanId = 1
                    };
    using (var context = new Db())
    {
        context.Database.Log = Console.WriteLine;
        context.Ninjas.Add(ninja);
        context.SaveChanges();
    }
}

但是,对context.SaveChanges()的调用失败,并带有模糊的消息:“更新条目时发生错误。有关详细信息,请参阅内部异常。”稍后出现三个内部异常,并出现以下消息:

  

INSERT语句与FOREIGN KEY约束冲突   “ FK_dbo.Ninjas_dbo.Clans_ClanId”。数据库中发生了冲突   “ NinjaDomain.DataModel.Db”,表“ dbo.Clans”,列“ Id”。的   语句已终止。

很明显,数据库中存在值1。为什么会发生此错误,我该如何解决?


根据要求:

namespace NinjaDomain.Classes
{
    using System;
    using System.Collections.Generic;

    public class Ninja
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool ServedInOniwaban { get; set; }
        public Clan Clan { get; set; }
        public int ClanId { get; set; }
        public List<NinjaEquipment> EquipmentOwned { get; set; }
        public DateTime DateOfBirth { get; set; }
    }

    public class Clan
    {
        public int Id { get; set; }
        public string ClanName { get; set; }
        public List<Ninja> Ninjas { get; set; }
    }
}

app.config文件包含以下信息:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

服务器资源管理器显示我有两个localdb实例:

  • (localdb)\MSSQLLocalDB(ID为1的氏族所在的地方)

  • (localdb)\ProjectsV13(不存在表)

似乎表是在(localdb)\MSSQLLocalDB中创建的,但是它正在尝试从(localdb)\ProjectsV13检索数据。

我是否只需要重新运行update-database命令以在正确的本地数据库中创建数据库?

0 个答案:

没有答案