强制代码优先始终初始化不存在的数据库?

2024-01-02

有时,我会删除我的开发数据库并运行我的 EF 代码优先应用程序。我会收到错误:

无法打开登录请求的数据库“AssessmentSystem”。登录失败。 用户“AssessmentAdmin”登录失败。

我认为这是因为DbContext仅“首次使用上下文时每个 AppDomain 运行一次”数据库初始化逻辑,如下所示这一页 http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm说。这意味着我需要回收 IIS 应用程序池,以便 EF 在我删除数据库时重新创建它。

有什么方法可以让数据库初始化代码运行每次我尝试访问数据库?因此,它会始终检查数据库是否存在,如果不存在,则创建它而不是尝试打开它,即使它使用之前访问我现在删除的数据库的相同 AppDomain?

请注意,我希望在以下位置完成此初始化检查每个查询,所以即使完成了Application_Start经常不够;理想情况下,我希望能够加载一些数据库数据,删除数据库,然后加载一些数据库数据,它会重新创建数据库,甚至不需要重新启动应用程序(基本上我只需要重新加载网页即可)加载一些数据库数据)。


初始化器当您需要访问数据库时执行,因此如果您想在应用程序启动时创建数据库,请使用以下任意命令:

    context.Database.Initialize(true); //If set to true the initializer is run even if it has already been run.       
    context.Database.Create()

http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.103).aspx http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.103).aspx

如果不存在则创建数据库IDatabaseInitializer 的实现,仅当数据库不存在时,才会重新创建数据库并可选地为数据库重新播种数据。要为数据库设定种子,请创建一个派生类并重写 Seed 方法。

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

http://msdn.microsoft.com/en-us/library/gg679221(v=vs.103).aspx http://msdn.microsoft.com/en-us/library/gg679221(v=vs.103).aspx

如果模型更改则删除创建数据库IDatabaseInitializer 的实现,仅当模型自创建数据库以来发生更改时,才会删除、重新创建数据库,并可选地使用数据重新播种数据库。这是通过在创建存储模型时将其哈希值写入数据库,然后将该哈希值与当前模型生成的哈希值进行比较来实现的。要为数据库设定种子,请创建一个派生类并重写 Seed 方法。

初始化策略可以选择检查数据库 存在,创建一个新数据库,并用数据播种该数据库。这 默认策略是一个实例 如果不存在则创建数据库。

Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

请注意,这假设您甚至有权删除数据库。

http://msdn.microsoft.com/en-us/library/gg679604(v=vs.103).aspx http://msdn.microsoft.com/en-us/library/gg679604(v=vs.103).aspx

始终删除创建数据库

IDatabaseInitializer 的实现,当第一次在应用程序域中使用上下文时,它始终会重新创建数据库,并可选择重新为数据库播种数据。要为数据库设定种子,请创建一个派生类并重写 Seed 方法。

Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());

http://msdn.microsoft.com/en-us/library/gg679506(v=vs.103).aspx http://msdn.microsoft.com/en-us/library/gg679506(v=vs.103).aspx

我建议你看看迁移如果您想跟踪,请将您对数据库所做的更改恢复到之前的状态http://msdn.microsoft.com/hr-hr/data/jj591621 http://msdn.microsoft.com/hr-hr/data/jj591621 .

UPDATE

context.Database.Initialize(true);

如果参数force设置为true,则运行初始化程序 无论之前是否运行过。这可以是 如果在应用程序运行时删除数据库并且需要删除数据库,则很有用 被重新初始化。

对于 MVC 应用程序,将一个部分添加到Application_Start()方法中的全局.asax

protected void Application_Start() {

     Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); 

     // Forces initialization of database on model changes.
     using (var context= new MyContext()) {
          context.Database.Initialize(force: true);
     }    
}

您也可以使用自定义初始化程序:

public class MyDbInit : DropCreateDatabaseAlways<MyContext>
{

}

然后使用

Database.SetInitializer(new MyDbInit());

UPDATE 2

创建一个新的空 MVC4 应用程序,名为在每个请求上删除数据库。 将以下内容放入 Global.asax Application_start 中

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            Database.SetInitializer<BlogContext>(new DropCreateDatabaseAlways<BlogContext>());    

            using (var context = new BlogContext())
            {
                context.Database.Initialize(force: true);
            }    
        }

创建一个名为的新控制器数据库控制器有两个动作。

In the Access您删除数据库并重定向到的操作重新创建从您创建先前删除的数据库的位置执行操作。

namespace DeleteDBOnEveryRequest.Controllers
{
    public class DatabaseController : Controller
    {
        public ActionResult Access()
        {
            using (var context = new BlogContext())
            {
                context.Database.Delete();
            } 
            return RedirectToAction("Recreated");
        }

        public ActionResult Recreated()
        {
            using (var context = new BlogContext())
            {
                context.Database.Initialize(force: true);                
            }
            return View();
        }
    }
}

这是你想要的吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制代码优先始终初始化不存在的数据库? 的相关文章

  • 延迟加载实体框架 v.1 中昂贵的字段

    在网上搜寻并认为我能找到解决方案后 我似乎又碰上了另一堵砖墙 我的数据库中有一个表 照片 包含 PhotoID 标题 排序和四组二进制数据的列 原始 大 中和小 是的 它基于旧的 ASP NET 入门工具包 并进行了各种修复等 我正在从 L
  • SQL Server 2008 R2 中的字符映射/逐字符搜索和替换

    我在 SQL Server 2008 R2 上运行 我们在这里有一个要求 即我需要创建将某些英文字符替换为以前在遗留系统中使用的区域设置语言字符 为此 我可能会使用 T SQL 中的替换函数 但在我的实践中 我们会逐个字符地替换 例如 AS
  • 增加超时时间

    我必须增加超时时间 以下是我的代码 Private Function GetConnectionInstance As SqlConnection Dim objConn As SqlConnection Dim strConnection
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 为什么这个 CTE 比使用临时表慢得多?

    自从我们的数据库最近更新以来 我们遇到了一个问题 我进行了此更新 我在这里感到内疚 从那时起 使用的其中一个查询要慢得多 我尝试修改查询以获得更快的结果 并设法使用临时表实现我的目标 这还不错 但我无法理解为什么该解决方案比基于 CTE 的
  • 实体框架 6 - 使用我的 getHashCode()

    这篇文章需要了解一定的背景知识 请耐心等待 我们有一个使用 EF 的 n 层 WPF 应用程序 我们通过 dbContext 将数据从数据库加载到 POCO 类中 dbContext 被销毁 然后用户可以编辑数据 我们使用 Julie Le
  • 到命名实例的 Sql 连接字符串

    我可以在示例代码项目中使用它连接到我的 sql server 2008 开发人员服务器 string connection data source SQLSERVER2008 Integrated Security SSPI Initial
  • 实体框架代码优先:如何手动更新数据库?

    我构建了一个小型 WPF 演示应用程序 它使用 EF Code First 将其数据保存在 SQL CE 4 0 DB 中 除非我从模型对象中删除属性 否则它工作正常 例如 如果我从此类中删除 HosteBy public class Di
  • 实体框架-实体映射问题

    我有两个表 地址和联系人 它们在 contactID 上连接 在联系人中 这两个表在我的实体数据模型 EF 4 0 中都有实体 我不想修改它们 我确实想创建一个包含两个实体信息的新实体 到目前为止我做了什么 In CSDL
  • 实体框架按枚举值按字母顺序排序

    我有一个名为Comment 其中有一个enum类型的属性CommentType public class Comment public virtual Guid Id get private set public virtual Comme
  • 为什么实体框架尝试选择所有列,即使我只指定了两列?

    我继承了一个 ASP MVC 项目 该项目使用 Entity Framework 6 1 3 与 Dynamics CRM 2011 SQL 数据库进行交互 我正在使用此查询来尝试获取具有帐号的所有活动帐户 并且我仅选择两列为匿名类型 va
  • LINQ to Entities 使用表达式参数选择列

    我无法理解如何通过指定表达式作为参数来设法在可查询中选择列 Method A IQueryable
  • 如何使实体框架存储过程异步?

    我有一个函数 ReturnStatementDetailsForSubRepAsync 它使用一个 linq 表达式 我可以使用内置函数轻松地使其异步 例如 ToListAsync 现在 因为此 LINQ 函数是异步的 所以我必须使父函数异
  • NotSupportedException:LINQ to Entities 无法识别该方法[重复]

    这个问题在这里已经有答案了 我正在尝试使此查询与 EF 一起使用 但它抛出异常 var c ac Communities OrderBy o gt o Posts Count Skip page limit Take limit Selec
  • 实体框架以错误的顺序插入子对象

    Question 为什么 EF 首先在它所依赖的对象 TimesheetActivity 之前插入具有依赖项的子对象 PersonnelWorkRecord 另外我有哪些纠正这个问题的选择 ERD 简化 This is predefined
  • Access 2007 - INSERT 和即时 SELECT 无法检索插入的数据

    我通过 OleDB 在表中插入几行 并立即选择插入的行 我无法以这种方式检索行 我必须等待大约 3 5秒 然后插入的行就会出现在表中 我在数据库本身中观察到了这种行为 我通过 OleDB 插入了行并观察了 Access 中打开的表 3 5
  • “'OFFSET'附近的语法不正确”将sql comm 2012修改为2008

    我用这个列出问题 SELECT q qTitle q qDescription q qCreatedOn u uCode u uFullname qcat qcatTitle q qId q qStatus FROM tblQuestion
  • EF Core 第二级 thenIninclude 错误

    假设首先有这些模型 Method有一个OriginalCode OriginalCode那有很多Mutants Mutant那有很多ParseSubTrees 现在当查询时Method我希望加载另一个 所以我有以下内容 Method tar
  • MVC 下拉列表未映射到模型

    我正在尝试使用 EF codefirst 在 MVC 3 中开发应用程序 当我使用 int 属性和约定来设置外键关系时 例如 public class Patient public int ConsultantId get set 然后 我
  • 哪种本机 dotNet 数据类型最适合传递 SQL Server HierarchyId 值?

    具体来说 我们有一个接受 HierarchyId 作为参数的 SQL Server 存储过程 并且通常我们的存储过程上有一个 SOAP 层 允许通过 SOAP 调用它们 SOAP 服务是使用 C 方法上的 WebMethod 属性来实现的

随机推荐

  • 为什么 coord_map 会产生奇怪的输出?

    我正在尝试使用绘制世界地图ggplot 我的代码在我的要点文件 https gist github com pachevalier 38666a7fecab76f986b4 当我不使用时输出是正确的coord map但当我使用时很奇怪coo
  • 使用 gatsby-plugin-react-i18next 时 Gatsby 找不到客户端路由

    我正在 Gatsby 中使用客户端路由gatsby plugin react i18next 当我尝试在不使用默认语言的情况下访问其中一个客户端路由时 例如url 前缀为 sv 然后我发现该路线不存在 如果我添加前缀 sv到路由器基本路径
  • Flume - 整个文件可以被视为 Flume 中的一个事件吗?

    我有一个用例 需要将目录中的文件提取到 HDFS 中 作为 POC 我在 Flume 中使用了简单的目录假脱机 其中我指定了源 接收器和通道 并且它工作得很好 缺点是我必须为进入不同文件夹的多种文件类型维护多个目录 以便更好地控制文件大小和
  • 在express中获取rawBody

    我正在尝试从帖子中检索某些内容 并且需要传入请求中的 rawBody 属性 我怎样才能取回它 我尝试使用express bodyParser 在我的帖子处理程序中 我正在寻找req rawBody 但它是未定义的 我什至尝试使用 conne
  • 属性“x”是私有的,只能在类“y”内访问

    我有这段代码 import Component from angular core import NavController Loading Alert from ionic angular Component templateUrl bu
  • MapView 检测滚动

    我希望如此MKMapView继承自UIScrollView就像UITableView and UICollectionView是 这样你就可以覆盖UIScrollView委托方法并执行您需要执行的操作 我找到了将平移手势附加到的方法MapV
  • 使用黄瓜运行量角器时如何仅运行一个特征文件?

    我有多个功能文件 我真的很想只运行一个文件或一个场景或一个标签 我知道我可以只在 cucumberConf js 的规范中提供一个文件 但我想运行一次而不用摆弄我的 cucumberConf js 运行量角器时需要输入哪些参数 在量角器的配
  • 如何使用您自己的编程语言来利用 VDSO 对象?

    最近的 Linux 内核 至少在 amd64 上 提供了一个名为的神奇对象文件linux vdso so 1它抽象了内核的系统调用接口 允许内核选择最佳的调用约定 如果你用 C 语言编写代码 glibc 会自动使用这个对象 现在 如果我想编
  • 我应该使用什么模型/模式来处理多个数据源?

    作为电子商务系统的一部分 我需要设计和实现某种黑匣子 这需要从各种内部和外部数据源 即网站 外联网 雅虎商店 亚马逊 xml 提要等 接受客户和订单 并插入 更新后端系统 用于插入 更新客户和订单数据的 API 已在网站上到位并且运行良好
  • 如何从 sip.voidptr (QImage.constBits()) 转换为 ctypes void 或 char 指针?

    我使用的是 python 当然你不能很快地循环遍历大图像的每个像素 所以我遵循 C DLL 我想做这样的事情 img QImage myimage png constBits imgPtr c void p img found ctypes
  • 如何使用 Java 在 Android 中获取 Google 搜索结果?

    我想将 Google 搜索功能添加到我的 Android 应用程序中 我想创建一种布局 可以在其中显示来自不同分支 书籍 视频 地图等 的结果 如何以编程方式获得结果 有 API 和示例吗 谷歌网页搜索 http code google c
  • Flurry Session 数据与 Google Analytics

    我们在 Android 和 iOS 应用程序上运行 Flurry 和 GA 然而 在同一时间段内 Flurry 上的会话数比 GA 上的会话数多 30 有人也经历过这个吗 理想情况下不想同时运行两者 在 Flurry 中 每次一项活动启动
  • 匹配任何 URL 参数值的正则表达式(Perl 语法)

    我正在努力寻找一种模式 允许我选择 URL 字符串的 Parameter Value 元素的值部分 我希望它足够通用 以便我可以用任何术语替换 参数 并检索其值 例如 如果 URL 字符串是 它始终遵循以下一般形式 我需要能够有选择地获取用
  • 如何将 JavaScript 和 HTML 保存在选项中而不自动转义?

    我自以为我很了解 WordPress 现在看来 update option 自动转义代码 如果我想在选项中保存一些 Javascript 或 HTML 代码 此行为会导致代码无法使用 我拒绝对返回值执行 str replace 来过滤掉每个
  • 将 UIAutomation Provider 添加到 Delphi 控件(特别是网格)

    我们的 VCL Delphi 应用程序有许多网格 我们需要开始通过 UIAutomation 与之交互 存在许多问题 尤其是 TStringGrid 没有实现任何 IUIAutomation 模式 IGridProvider 或 ITabl
  • Django 反向和 url 默认值而不是 NoReverseMatch

    是否可以设置一个默认 URL 当无法找到反向匹配时将使用该默认 URL 这个想法是 如果在生产中出现拼写错误 我想显示类似于 404 或描述性错误页面的内容 而不是获得 NoReverseMatch 异常 templatetag url 引
  • Docker EE(企业版)、Docker CE(社区版)和 Docker(自定义支持)之间的具体区别是什么

    Docker 安装指南确实包含三种不同的安装 Docker 的方法 我想知道这三个组件之间的确切区别 Docker CE 社区版 是简单经典的OSS 开源软件 Docker 引擎 Docker EE 企业版 https docs docke
  • 当 Modal 和 Popup 设置为 True 时,MS Access 表单会调整大小

    我过去多次遇到过这个问题 想知道如何解决 When Modal and Popup在 MS Access 2003 表单上设置为 True 在看起来不一致的情况下 当表单加载时 表单将在屏幕的左上角聚集在一起 有时会发生 有时不会 我似乎无
  • c# webservice返回错误

    我需要一些关于这方面的帮助 请对我温柔一点 我还不是专家 问题是我试图通过 JSON 将数据从客户端 浏览器 发送到服务器 Web 服务 当我在 Fiddler 中查看 POST 数据时 我可以看到我发送的 JSON 这是有效的 经过测试
  • 强制代码优先始终初始化不存在的数据库?

    有时 我会删除我的开发数据库并运行我的 EF 代码优先应用程序 我会收到错误 无法打开登录请求的数据库 AssessmentSystem 登录失败 用户 AssessmentAdmin 登录失败 我认为这是因为DbContext仅 首次使用