实体框架代码的第一个INSERT语句与FOREIGN KEY约束冲突

本文关键字:FOREIGN KEY 约束 冲突 语句 INSERT 框架 代码 第一个 实体 | 更新日期: 2023-09-27 17:57:29

我首先在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,"ClanName"。现在,在我的程序类中运行代码时,我试图在名为Ninja的表中插入行,因为Ninja表的外键为ClanId,我提供的ClanId为1,所以它不应该抛出外键约束。

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

另一方面,当我尝试在数据库中运行下面的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()

实体框架代码的第一个INSERT语句与FOREIGN KEY约束冲突

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