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