MVC .Net 无法停止尝试重新创建表

Posted

技术标签:

【中文标题】MVC .Net 无法停止尝试重新创建表【英文标题】:MVC .Net can't get it to stop trying to recreate tables 【发布时间】:2015-12-10 18:11:57 【问题描述】:

我启用了迁移 - 但是,现在我正在移动到实时服务器,似乎迁移仍在尝试更新数据库,因为我收到了错误:

CREATE TABLE permission denied in database 'secn'.

我的模型文件夹中的上下文文件中有这个:

namespace lhts2.Models

     public class DefaultConnection : DbContext
     
            public DefaultConnection() : base("name=DefaultConnection")
        
            Database.SetInitializer<DefaultConnection>(null);
        
    

...在我的 web.config 文件中,我的连接字符串是:

  <add name="DefaultConnection" connectionString="Data Source=[servername];
  Initial Catalog=secn; Integrated Security=True;" providerName="System.Data.SqlClient" />

我也删除了 Migrations 文件夹并重新发布 - 但我仍然收到上述错误。

我的 web.config 文件中也有这个:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

除了我的模型文件夹中的上下文文件之外,我是否需要在其他地方设置 SetInitializer?

感谢您的建议,

标记

【问题讨论】:

web.config 文件中有 EF 初始化吗? 嗨,布兰登 - 我想是的 - 我已经用 web.config 中提到的 EF 部分更新了我的问题 - 谢谢, 您有其他东西,例如可能正在尝试创建表格的会员服务提供商? 不——这是我从 VS2013 开始的一个干净的项目——我确实添加了实体框架,并为本地数据库做了一个更新数据库——除此之外,我没有添加任何其他包或提供者。 【参考方案1】:

来自here:

...初始化器应该在你的上下文的静态构造函数中设置。静态构造函数在任何构造函数之前调用并执行一次。这就是我们想要的。原因是在您的某些应用程序中,您可能会多次初始化上下文。您不想执行所有过程来检查数据库是否准备好更改。

所以,你应该改变你的类,让它拥有一个只被调用一次的静态构造函数。

namespace lhts2.Models

     public class DefaultConnection : DbContext
     
        static DefaultConnection()
        
            Database.SetInitializer<DefaultConnection>(null);
        

        public DefaultConnection() : base("name=DefaultConnection")
        
        
    

【讨论】:

嗨-感谢您的建议-我将上下文更改为完全一样,现在收到此消息:lhts2.Models.DefaultConnection.DefaultConnection()':静态构造函数不能有明确的“this”或'base' 构造函数调用 C:\Users\Mark\Documents\Webapps\lhts2\lhts2\Models\LHTS2Context.cs 谢谢。我更新了答案。从那篇文章中不清楚是否包含它,所以我做出了错误的决定。不过,它应该可以在没有基本构造函数调用的情况下工作。 再次感谢 - 出于某种原因,我仍然收到错误:数据库 'lhtssecn' 中的 CREATE TABLE 权限被拒绝。 因此,您在DefaultConnection 连接字符串中注册的用户没有 CREATE TABLE 权限。您需要将它们添加到您的数据库中(您可能应该首先备份它以防万一)。最好运行具有比应用程序更高权限的初始化程序,以便它可以完成工作。 嗨 NightOwl888 - 你明白了 - 我仍然不知道为什么它试图创建一个表,但是给它权限就可以了。如果您想添加为答案,我会将其标记为这样。谢谢你的帮助,马克【参考方案2】:

我有同样的问题。将 IIS 用户设置为“sysad”级别的用户允许应用程序正常工作。但是,这不是解决问题的安全方法。

进一步的研究表明,“迁移”表(名为 dbo.__MigrationHistory)是罪魁祸首。我已授予 IIS 用户对所有“应用程序”表的访问权限(选择、更新、删除、插入和引用),但没有授予“迁移”表。因此,当应用程序运行并尝试确定是否需要迁移时,由于该用户缺乏访问权限,访问失败,并且应用程序认为它需要创建数据库和表——该用户显然不应该拥有这些权限做。

通过提供对 __MigrationHistory 表(选择、更新、删除、插入和引用)的正常访问权限,IIS 用户现在能够确定不需要迁移,因此不会尝试进行迁移。 Example of Permission Settings Here

【讨论】:

以上是关于MVC .Net 无法停止尝试重新创建表的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

如何在表之间交换行后正确重新排序 ID(jQuery 和 ASP.NET MVC4)

如何在 ASP.NET MVC 5、Entity Framework 6 中使用流利的 API 映射表?

在 asp.net MVC 上创建 Azure 存储表

在asp.net mvc中删除数据成功后重新排序自动编号列JQuery Datatable

ASP.NET MVC: EF 没有创建数据库表