SaveChange()中的FK约束

时间:2016-10-09 10:47:56

标签: c# entity-framework code-first

学习EF6 code-first。根据外键约定,我将 StandardId 作为学生表的FK而不是丑陋的 Standards_StandardId 。即使我按照单词到单词进行教程,我在ctx.SaveChanges()更新数据库时也遇到了异常。

我认为我的实体框架的某些约定无法正常工作。所以我在[ForeignKey("StandardId")]上尝试了DataAnnotation public Standard Part { get; set; }来覆盖FK。但我仍然收到完全相同的错误!

我的SQL Server“不与”我的实体框架交谈,或者某些内容已损坏?以下是所有代码和错误消息:

实体模型

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和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 \”。冲突发生在   database \“EF_Code_First_Tutorials.SchoolContext \”,表格   \“dbo.Standards \”,列'StandardId'。\ r \ n声明已经   终止。“}

1 个答案:

答案 0 :(得分:1)

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; }