FK constraint at SaveChange()
本文关键字:SaveChange at constraint FK | 更新日期: 2023-09-27 18:12:09
学习EF6代码优先。根据外键约定,我将使用StandardId作为学生表的FK,而不是难看的Standards_StandardId。尽管我逐字逐句地遵循教程,但我在ctx.SaveChanges()
更新数据库时遇到了异常。
我认为我的实体框架的一些约定不能正常工作。所以我尝试了public Standard Part { get; set; }
上的DataAnnotation [ForeignKey("StandardId")]
来覆盖FK。但我仍然收到完全相同的错误!
是我的SQL Server"不说话"我的实体框架,还是什么东西是损坏的?以下是所有代码和错误信息的详细信息:
<<p> 实体模型/strong>public class Student {
public Student() { }
public int StudentID { get; set; }
public string StudentName { get; set; }
//Foreign key for Standard
public int StandardId { get; set; } <- StandardId, not Standard_StandardId
public Standard Standard { get; set; } }
public class Standard {
public Standard() { }
public int StandardId { get; set; }
public string StandardName { get; set; }
public ICollection<Student> Students { get; set; } }
DbContext and DbSet
namespace EF_Code_First_Tutorials {
public class SchoolContext: DbContext {
public SchoolContext(): base() { }
public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; } } }
主要class Program {
static void Main(string[] args) {
using (var ctx = new SchoolContext()) {
Student stud = new Student() { StudentName = "New Student" };
ctx.Students.Add(stud);
ctx.SaveChanges(); } } } <-- ERROR!
Visual Studio
在InnerException类型的异常"System.Data.Entity.Infrastructure。DbUpdateException'发生在EntityFramework.dll,但未在用户代码中处理
{" INSERT语句与FOREIGN KEY约束冲突FK_dbo.Students_dbo.Standards_StandardId '"'"。冲突发生在数据库EF_Code_First_Tutorials '"。SchoolContext '",表dbo '"。,列'StandardId'。'r'n声明已经终止。"}
你的Student
和Standard
的关系是不是可选的,这是必须的。这意味着,当您保存Student
时,它必须将StandardId
分配给现有的Standard
记录的id。
编辑:
所以,你的程序应该包括Standard
对象的创建:
class Program {
static void Main(string[] args) {
using (var ctx = new SchoolContext()) {
Student stud = new Student() { StudentName = "New Student" };
ctx.Students.Add(stud);
Standard stan = new Standard { StandardId = 524 };
stud.StantardId = stan.StandardId;
ctx.Standards.Add(stan);
ctx.SaveChanges(); } } }
如果你想让关系是可选的,Student
应该有
public int? StandardId { get; set; }
代替:
public int StandardId { get; set; }