【问题标题】:Entity Framework code first INSERT statement conflicted with the FOREIGN KEY constraint实体框架代码第一个 INSERT 语句与 FOREIGN KEY 约束冲突
【发布时间】:2016-07-16 21:03:47
【问题描述】:

我首先在 Sqlserver 2008 R2 中使用 EF6 代码。

下面是我的模型类

  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 System.DateTime  DateOfBirth { get; set; }
    }
    public class NinjaEquipment
    {
        public int Id { get; set; }
        public string  ClanName { get; set; }
        public EquipmentType Type { get; set; }
        [Required]
        public Ninja Ninja { get; set; }

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

    }

还有如下的 DbContext 类,

 public class NinjaContext: DbContext 
    {
        public DbSet<Ninja> Ninjas { get; set; }
        public DbSet<Clan> Clans{ get; set; }
        public DbSet<NinjaEquipment> Equipment { get; set; }
    }

这是我的程序课,

 class Program
    {
        static void Main(string[] args)
        {
            InsertNinja();
            Console.ReadKey();


        }

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

            }
        }
    }

在运行代码之前,我在 Clan 表中插入了值。 氏族表有一行如下 1,“氏族名称”。 现在,在我的程序类中运行代码时,我试图在名为 Ninja 的表中插入行,因为 Ninja 表的外键为 ClanId ,我将 clanId 提供为 1 ,所以它不应该抛出外键约束。

当我试图运行这个程序时,我得到了以下错误,{“插入 语句与 FOREIGN KEY 约束冲突 \"FK_dbo.Ninjas_dbo.Clans_ClanId\"。数据库发生冲突 \"NinjaDomain.DataModel.NinjaContext\",表 \"dbo.Clans\",列 'Id'。\r\n语句已终止。"}

另一方面,当我尝试针对 db 运行以下 sql 脚本时,我能够成功运行它,

INSERT [dbo].[Ninjas]([Name], [ServedInOniwaban], [ClanId], [DateOfBirth])
VALUES ('JulieSan', 'False', '1', '01-01-1980 00:00:00' )
SELECT [Id]
FROM [dbo].[Ninjas]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()

【问题讨论】:

  • 你好像要添加一个ClanId为1的Ninja,但是没有Id为1的Clan,所以违反了外键约束
  • 您能否在插入Ninja 之前尝试从数据库中重新加载Clanninja.Clan = db.Clans.Find(1);你会成功加载吗?
  • 实际上,我刚刚尝试创建一个示例项目,您提到的所有内容对我来说都是正确的。 NinjaClan 被正确插入。请注意您的Id可能是数据库生成的,所以您的ClanId不能等于1。确保你的表中有一个Clan,它的Id 等于1。我不确定我还能提出什么建议,因为您的问题不会在我这边重现。

标签: c# sql entity-framework entity-framework-6


【解决方案1】:

实际上这是数据库服务器名称的问题。我在 EF 适配器中使用名称为 : (localdb)\mssqllocaldb 的 db 所以所有 db 架构都是在 EF 适配器项目中创建的。然后我添加了控制台应用程序并在该演示项目中安装了 EF。在演示项目(控制台应用程序)中添加 EF 后,它默认创建了 App.Config,所以我从 EF 适配器项目中删除了 app.config。 所以控制台应用程序的 app.config 指向 .\SqlExpress db 而不是 (localdb)\mssqllocaldb。 我的错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多