【问题标题】:Database not created automatically数据库未自动创建
【发布时间】:2017-05-27 20:55:26
【问题描述】:

我创建了一个 ASP.NET MVC 4 项目。我知道,只要有一个DbContext 派生类,如果我实例化这个类,例如:

MyContextDb _db = new MyContextDb();

向它索取数据,它应该出去看看是否存在数据库。如果该数据库不存在,它应该为我创建。

但是,我正在测试这个理论,但它不起作用。我的MyDbContext 类中有一个属性:

public DbSet<Restaurant> Restaurants { get; set; } 

对于这个属性,我的Models 文件夹中有一个类:

public class Restaurant
{
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
}

这是我在互联网上找到的教程的一部分。我构建了项目(顺便说一下,我有 Entity Framework 6.1.3 和 SQL Server 2016 Express 版本),我得到的错误是:

EntityFramework.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

其他信息:在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:50 - 发生本地数据库运行时错误。无法创建自动实例。有关错误详细信息,请参阅 Windows 应用程序事件日志。

这是我的连接字符串,添加到配置部分内的web.config 文件中:

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.\v13.0;Initial Catalog=aspnet-mydb-20170527102515;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-mydb-20170527102515.mdf" 
         providerName="System.Data.SqlClient" />
</connectionStrings>

不知道还有什么可以尝试的。我可以通过 Windows 身份验证通过 localhost(或点)和无凭据访问 SQL Server,并且我已将 SQL Server 设置为允许远程连接并允许混合模式身份验证(通过凭据或通过 Windows)。对此有什么想法吗?很常见的情况,但到目前为止我尝试过的任何事情似乎都没有帮助。

我也尝试过UDL技巧(保存一个扩展名为.udl的文件,双击它,在小对话界面中输入参数连接,成功测试连接后,然后将udl作为文本打开,如下所示上:

<add name="Def" 
     connectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=anotherDb;Data Source=."/>

然后我将web.config 中的anotherDb 替换为我想要的数据库名称,希望它是由ASP.NET 创建的,但不是。)

我还应该尝试什么?

============

我通过将它添加到 web.config 来让它工作

 <add name="connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\mvcpath\begin\course1\MyProj\App_Data\Database123.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>

这件作品作为构造函数:

public MyContextDb() : base("connStr")
{
    Database.SetInitializer<MyContextDb>(new CreateDatabaseIfNotExists<MyContextDb>());
}

【问题讨论】:

  • 好吧,既然你不是每天都创建数据库,那就自己创建数据库吧。否则,如果您希望在上下文更改时删除并重新创建数据库,则可以使用 DropCreateDatabaseIfModelChanges - stackoverflow.com/questions/8793184/…
  • 您的问题,如异常中所述,与 SQL Server 的连接有关。安装 SQL Server 或修复连接字符串,您将看到数据库和表将被创建。

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

Entity Framework 不应该这样做,并且它永远不会为您创建一个数据库,除非您明确要求它为您创建一个数据库(如果它不存在)。

您需要将此添加到上下文的构造函数代码中:

if (!Database.Exists())
{
    Database.Create();
}

或者您可以使用适合您的数据库初始化策略,例如:

Database.SetInitializer<MyContextDb>(new CreateDatabaseIfNotExists<MyContextDb>());

【讨论】:

  • 在控制器里,卡米洛?有什么特别的方法吗?
  • @Halle 你可以在 DbContext 的构造函数中做到这一点
  • 这不是真的,您可以配置和使用数据库初始化程序:entityframeworktutorial.net/code-first/…
  • 除了最简单和最简化的用例之外,可以在任何情况下添加它,生成数据库不会在应用程序中发生。初始化它可能(对于任何严重的事情也是不好的风格),但普通用户将无权在体面的公司数据库服务器上分配空间。数据库维护通常应该涉及一些计划步骤,如果有任何事情可以确保备份到位。例子? Sharepoint、TFS 等 - 都不会神奇地把你的文件放在“某处”。
  • @TomTom 完全正确。用户在严肃的公司中没有 CREATE DATABASE 权限,因此 EF 甚至不应该尝试这样做。但是,它在开发过程中确实有很大帮助
【解决方案2】:

这里接受的答案有一些不清楚的地方。

在SchoolContext.cs

namespace ContosoUniversity.DAL
{
    public class SchoolContext : DbContext
    {

        public SchoolContext() : base("SchoolContext")
        {
        }
   }
}

在Web.config

<contexts>
      <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
        <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
      </context>
    </contexts>

然后自定义初始化器SchoolInitializer.cs

namespace ContosoUniversity.DAL
{
    public class SchoolInitializer : System.Data.Entity.CreateDatabaseIfNotExists<SchoolContext>
    {
        protected override void Seed(SchoolContext context)
        {
            ....
         }
}

这是你应该考虑的方式。

或者,您可以使用代码优先迁移。在这种情况下,您必须在上下文中注释您的初始化程序。代码首先将在包管理器的每个 update-database 语句之后使用 Seed 方法。

在 configuration.cs 中(来自迁移文件夹)。

namespace ContosoUniversity.Migrations
{
    using ContosoUniversity.Models;
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
        {
            var students = new List<Student>
            {
                new Student { FirstMidName = "Carson",   LastName = "Alexander",
                    EnrollmentDate = DateTime.Parse("2010-09-01") },
                new Student { FirstMidName = "Meredith", LastName = "Alonso",
                    EnrollmentDate = DateTime.Parse("2012-09-01") },
                new Student { FirstMidName = "Arturo",   LastName = "Anand",
                    EnrollmentDate = DateTime.Parse("2013-09-01") },
                new Student { FirstMidName = "Gytis",    LastName = "Barzdukas",
                    EnrollmentDate = DateTime.Parse("2012-09-01") },
                new Student { FirstMidName = "Yan",      LastName = "Li",
                    EnrollmentDate = DateTime.Parse("2012-09-01") },
                new Student { FirstMidName = "Peggy",    LastName = "Justice",
                    EnrollmentDate = DateTime.Parse("2011-09-01") },
                new Student { FirstMidName = "Laura",    LastName = "Norman",
                    EnrollmentDate = DateTime.Parse("2013-09-01") },
                new Student { FirstMidName = "Nino",     LastName = "Olivetto",
                    EnrollmentDate = DateTime.Parse("2005-08-11") }
            };
            students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
            context.SaveChanges();

            var courses = new List<Course>
            {
                new Course {CourseID = 1050, Title = "Chemistry",      Credits = 3, },
                new Course {CourseID = 4022, Title = "Microeconomics", Credits = 3, },
                new Course {CourseID = 4041, Title = "Macroeconomics", Credits = 3, },
                new Course {CourseID = 1045, Title = "Calculus",       Credits = 4, },
                new Course {CourseID = 3141, Title = "Trigonometry",   Credits = 4, },
                new Course {CourseID = 2021, Title = "Composition",    Credits = 3, },
                new Course {CourseID = 2042, Title = "Literature",     Credits = 4, }
            };
            courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s));
            context.SaveChanges();

            var enrollments = new List<Enrollment>
            {
                new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Alexander").ID,
                    CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID,
                    Grade = Grade.A
                },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Alexander").ID,
                    CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID,
                    Grade = Grade.C
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Alexander").ID,
                    CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                     StudentID = students.Single(s => s.LastName == "Alonso").ID,
                    CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                     StudentID = students.Single(s => s.LastName == "Alonso").ID,
                    CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Alonso").ID,
                    CourseID = courses.Single(c => c.Title == "Composition" ).CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Anand").ID,
                    CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Anand").ID,
                    CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
                    Grade = Grade.B
                 },
                new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Barzdukas").ID,
                    CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Li").ID,
                    CourseID = courses.Single(c => c.Title == "Composition").CourseID,
                    Grade = Grade.B
                 },
                 new Enrollment {
                    StudentID = students.Single(s => s.LastName == "Justice").ID,
                    CourseID = courses.Single(c => c.Title == "Literature").CourseID,
                    Grade = Grade.B
                 }
            };

            foreach (Enrollment e in enrollments)
            {
                var enrollmentInDataBase = context.Enrollments.Where(
                    s =>
                         s.Student.ID == e.StudentID &&
                         s.Course.CourseID == e.CourseID).SingleOrDefault();
                if (enrollmentInDataBase == null)
                {
                    context.Enrollments.Add(e);
                }
            }
            context.SaveChanges();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 2014-08-08
    • 1970-01-01
    • 2012-08-23
    • 2022-10-13
    • 2016-11-12
    • 2019-05-06
    • 2011-05-26
    相关资源
    最近更新 更多