学习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声明已经 终止。“}
答案 0 :(得分:1)
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; }