【问题标题】:How to add Rows to Two Tables in One Transaction?如何在一个事务中向两个表添加行?
【发布时间】:2014-12-09 19:23:42
【问题描述】:

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

我的场景很简单。我有两个三个表,Student、Courses 和 Enrollments,定义如下。

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

现在,如果我想在一个数据库事务中向 Student 表和 Enrollment 表添加记录,我将如何去做。 假设 Course 表中有三门课程: CourseId:1,CourseName:数学,TotalCredits:4 CourseId:2,CourseName:物理,TotalCredits:4 CourseId: 3, CourseName: Chemistry, TotalCredits: 4

如果我尝试添加学生和注册,我将如何获得要添加的学生的 ID?伪代码如下:

Student s = new Student();
s.FirstName = "John";
s.LastName = "Doe";
db.Student.Add(s);
db.SaveChanges();   
Enrollment e = new Enrollment();
e.CourseId = 1;
e.StudentId = s.StudentId //I need to get the student id for the above added student. How?
db.Enrollment.Add(e);
db.SaveChanges();

【问题讨论】:

  • 这是实体框架,还是什么风格的 LINQ?

标签: sql asp.net-mvc entity-framework


【解决方案1】:

不要手动设置 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"
    }
};

【讨论】:

  • 这看起来很有希望。我试过了,还是不行。添加注册时,StudentId 仍显示为 0。
  • 它会一直运行到你运行SaveChanges
  • 我就是这么想的。但是在运行 SaveChanges 之后,我在数据库中看不到注册记录。
  • 如果您将 Enrollment 实例添加到 DbSet 并运行 SaveChanges 且没有出现错误,那么它会将其保留在某处。也许,您认为您的应用程序连接到的数据库实际上并不是它连接到的数据库。
  • 我将尝试调试。我知道数据库是对的,它添加了学生记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多