【问题标题】:Data not showing up in particular tables, only one table has data数据未显示在特定表中,只有一个表有数据
【发布时间】:2015-07-19 22:50:47
【问题描述】:

由于某种原因,只有 Student 的数据在 Student 的表中生成。但是,注册表和课程表中没有数据,即使我将它们添加到 SchoolInitializer 中。我错过了什么吗?有什么建议?启动我的应用程序时,我会关闭与我的数据库的连接,重建解决方案,然后不调试就开始,单击正在创建数据的链接,然后检查我的表。

namespace MyFirstWebApplication.Models
{
    public class SchoolInitializer : DropCreateDatabaseIfModelChanges<SchoolContext>
    {
        protected override void Seed(SchoolContext context)
        {
            var students = new List<Student>
            {
                new Student{FirstName = "James", LastName= "Dean", EnrollmentDate = DateTime.Parse("2014-01-02") },
                new Student{FirstName = "Lynda", LastName = "Thames", EnrollmentDate = DateTime.Parse("2013-11-02")}
            };

            foreach (var temp in students)
            {
                context.Students.Add(temp);
            }
            context.SaveChanges();

            var courses = new List<Course>
            {
                new Course{CourseName = "Java", TotalCredits = 4},
                new Course{CourseName = "C#", TotalCredits = 4}
            };

            foreach (var temp in courses)
            {
                context.Courses.Add(temp);
            }

            context.SaveChanges();

            var enrollments = new List<Enrollment>
            {
                new Enrollment{StudentId = 1, CourseId = 1, Grade = 3},
                new Enrollment{StudentId = 1, CourseId = 2, Grade = 4}
            };

            foreach (var temp in enrollments)
            {
                context.Enrollments.Add(temp);
            }
            context.SaveChanges();
        }
    }
}

namespace MyFirstWebApplication.Models
{
    public class SchoolContext : DbContext
    {   //enables CRUD functionality
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

namespace MyFirstWebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            Database.SetInitializer<SchoolContext>(new SchoolInitializer() );
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

【问题讨论】:

  • 好的,我发现了问题。就是这个方法:protected override void OnModelCreating 这个方法阻止了我更新我的表和数据。有什么理由吗?例如,我为 SchoolInitializer 中的学生列表添加了一个新学生。在没有调试的情况下重建并开始,我的页面没有随着新学生更新。我注释掉了该方法并重建并在没有调试的情况下开始,并且列表与我在数据库中的表一起更新

标签: c# asp.net asp.net-mvc database visual-studio


【解决方案1】:

尝试在最后只调用一次context.SaveChanges()

还可以查看以下 SO 问题/答案:

Multiple SaveChanges Calls in Entity Framework

Call SaveChanges twice inside transaction

【讨论】:

  • 我已进行此更改,但我的 Enrollment 和 Course 表中仍然没有数据。看完你提供的链接后,我会回复你
【解决方案2】:

如果您使用身份字段作为密钥,您应该获取生成的数据库密钥。例如,您应该使用:

var newStudent = context.Students.Add(new Student{...});
context.SaveChanges();
var newStudentId = newStudent.StudentId

然后您可以使用此 ID 插入您的注册。类似的东西:

context.Enrollments.Add(new Enrollment{StudentId = newStudentId, CourseId = 1, Grade = 3});

您必须考虑的另一件事是 Seed 方法调用 savechanges 方法。

您应该查看 AddOrReplace 方法。这是向数据库中插入数据的首选方法。

【讨论】:

  • 对于使用生成的数据库密钥,这会有什么不同吗?似乎更像是一种“更好的实践”的建议哈哈。那是错字吗?你说“你要考虑的另一件事是种子方法......”你是说种子方法进行调用,所以我不必明确地说出来吗?不太确定
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多