Sql 如何在一个事务中将行添加到两个表中?

Sql 如何在一个事务中将行添加到两个表中?,sql,asp.net-mvc,entity-framework,Sql,Asp.net Mvc,Entity Framework,我刚刚开始学习C#,和.NET。我的问题可能很简单,但任何帮助都会很好 我的情况很简单。我有两个三表,学生表、课程表和报名表,定义如下 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace MyFirstProject.Models { public class

我刚刚开始学习C#,和.NET。我的问题可能很简单,但任何帮助都会很好

我的情况很简单。我有两个三表,学生表、课程表和报名表,定义如下

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace MyFirstProject.Models
{
    public class Student
    {
        [Key]
        public int StudentId { get; set; }

        [Required(ErrorMessage = "Custom error message: First Name is required")]
        [MaxLength(50)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "Custom error message: Last Name is required")]
        [MaxLength(50)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        public DateTime EnrollmentDate { get; set; }
        public virtual ICollection<Enrollment> Enrollments { get; set; }  
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;

namespace MyFirstProject.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseId { get; set; }

        public string CourseName { get; set; }

        [Range(0, 5, ErrorMessage = "Number of credits must be between 0 and 5")]
        public int TotalCredits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }    
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace MyFirstProject.Models
{
    public class Enrollment
    {
        public int EnrollmentId { get; set; }
        public int StudentId { get; set; }
        public int CourseId { get; set; }

        [DisplayFormat(DataFormatString = "{0:#.#}", ApplyFormatInEditMode = true, NullDisplayText = "No Grade")]
        public decimal? Grade { get; set; }
        //Every enrollment has at least one student and one course.
        public virtual Student student { get; set; }
        public virtual Course course { get; set; }
    }
}

不要手动设置id。相反,设置与
student
属性的关系

e.student = s;
值得一提的是,您还应该使用对象初始化,因为它使代码更干净。不要创建一个新实例,然后逐个填充属性,而是按如下方式操作:

var s = new Student
{
    FirstName = "John",
    LastName = "Doe"
};

var e = new Enrollment
{
    CourseId = 1,
    student = s
};

// this will actually add student as well since it's related
db.Enrollment.Add(e);
db.SaveChanges();
此外,如果要添加新的相关项,实际上可以将两个对象初始化组合起来:

var e = new Enrollment
{
    CourseId = 1,
    student = new Student
    {
        FirstName = "John",
        LastName = "Doe"
    }
};

这是实体框架,还是LINQ的什么风格?这看起来很有希望。我试过了,但还是不起作用。添加注册时,StudentId仍然显示为0。它将一直显示,直到您运行
SaveChanges
。这就是我的想法。但是在运行SaveChanges之后,我在数据库中看不到注册记录。如果您将
注册
实例添加到DbSet,并且运行
SaveChanges
时没有错误,那么它会将其保留在某个位置。也许,您认为应用程序连接到的数据库实际上不是它连接到的数据库。我将尝试并调试。我知道数据库是对的,它添加了学生记录。
var e = new Enrollment
{
    CourseId = 1,
    student = new Student
    {
        FirstName = "John",
        LastName = "Doe"
    }
};