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

类型的异常"System.Data.Entity.Infrastructure。DbUpdateException'发生在EntityFramework.dll,但未在用户代码中处理

在InnerException

{" INSERT语句与FOREIGN KEY约束冲突FK_dbo.Students_dbo.Standards_StandardId '"'"。冲突发生在数据库EF_Code_First_Tutorials '"。SchoolContext '",表dbo '"。,列'StandardId'。'r'n声明已经终止。"}

FK constraint at SaveChange()

你的StudentStandard的关系是不是可选的,这是必须的。这意味着,当您保存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; }