【发布时间】: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之前尝试从数据库中重新加载Clan?ninja.Clan = db.Clans.Find(1);你会成功加载吗? -
实际上,我刚刚尝试创建一个示例项目,您提到的所有内容对我来说都是正确的。
Ninja和Clan被正确插入。请注意您的Id可能是数据库生成的,所以您的Clan的Id不能等于1。确保你的表中有一个Clan,它的Id等于1。我不确定我还能提出什么建议,因为您的问题不会在我这边重现。
标签: c# sql entity-framework entity-framework-6