C# SaveChange()处的FK约束

C# SaveChange()处的FK约束,c#,entity-framework,code-first,C#,Entity Framework,Code First,学习。按照外键约定,我将使用标准ID作为学生表的FK,而不是丑陋的标准\u标准ID。尽管我逐字逐句地学习了教程,但在ctx.SaveChanges()更新数据库时还是遇到了异常 我认为我的实体框架的某些约定不能正常工作。因此,我尝试在公共标准部分{get;set;}上使用DataAnnotation[ForeignKey(“StandardId”)]来覆盖FK。但我还是收到了完全相同的错误 我的SQL Server是否“未与”我的实体框架“对话”,或者某些内容已损坏?以下是所有代码和错误消息的详

学习。按照外键约定,我将使用标准ID作为学生表的FK,而不是丑陋的标准\u标准ID。尽管我逐字逐句地学习了教程,但在
ctx.SaveChanges()
更新数据库时还是遇到了异常

我认为我的实体框架的某些约定不能正常工作。因此,我尝试在
公共标准部分{get;set;}
上使用DataAnnotation
[ForeignKey(“StandardId”)]
来覆盖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; } }
公共班级学生{
公立学生(){}
公共int StudentID{get;set;}
公共字符串StudentName{get;set;}
//标准的外键

public int StandardId{get;set;}您的
学生
标准
之间的关系是非可选的,它是必需的。这意味着,当您保存
学生
时,必须将
标准id
分配给现有的
标准
记录的id

编辑

因此,您的程序应该包括创建
标准
对象:

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(); } } }
如果要使关系成为可选关系,则学生应具有

public int?标准ID{get;set;}

而不是:


public-int-StandardId{get;set;}

如果我删除
public-int-StandardId{get;set;}
并使用默认的
Standards\u-StandardId
,它就会工作。但我更喜欢使用与其相关主键(StandardId)相同的FK名称。它现在可以工作了。除了浏览SSMS中的行外,当移动鼠标悬停时,我看到SSMS红色下划线
StandardId
,它显示
无效列名“StandardId”
。我的代码似乎都可以正常工作,只是想知道为什么SSMS在SQL脚本窗口中将其下划线为无效。您对DB的查询仍在执行吗?如果是,则忽略错误现在,SSMS有时会像那样发疯。我不知道原因,所以你必须用SSMS多搜索一点来解决这个问题。谢谢。查询在DB中执行得很好。SSMS只是用红色下划线。我将研究它或将其作为一个新问题发布。原来神秘的下划线是由于Intellisense缓存。SeE
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!
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(); } } }