我已启用迁移 - 但是,现在我正在转移到实时服务器,似乎迁移仍在尝试更新数据库,因为我收到错误:
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,而不是在models模块的上下文文件中?
感谢您的任何建议,
标记
答案 0 :(得分:0)
来自here:
...应该在上下文的静态构造函数中设置初始值设定项。静态构造函数在任何构造函数之前调用并执行一次。这就是我们想要的。原因是在某些应用程序中,您可能会多次初始化上下文。您不希望执行所有过程来检查数据库是否准备好进行更改。
所以,你应该改变你的类,使其具有一次只被调用一次的静态构造函数。
namespace lhts2.Models
{
public class DefaultConnection : DbContext
{
static DefaultConnection()
{
Database.SetInitializer<DefaultConnection>(null);
}
public DefaultConnection() : base("name=DefaultConnection")
{
}
}
}
答案 1 :(得分:0)
我有同样的问题。将IIS用户设置为&#34; sysad&#34;级别用户允许应用程序正常工作。然而,这不是解决问题的安全方法。
进一步的研究表明,&#34;迁移&#34; table(名为dbo .__ MigrationHistory)是罪魁祸首。我已经为所有&#34;应用程序&#34;提供了IIS用户访问权限(选择,更新,删除,插入和引用)。表,但不是&#34;迁移&#34;表。因此,当应用程序运行并尝试确定是否需要迁移时,访问会因为缺少该用户的访问权限而失败,并且应用程序认为需要创建数据库和表 - 这个用户显然不应该拥有权限。做。
通过为__MigrationHistory表(选择,更新,删除,插入和引用)提供正常访问权限,IIS用户现在可以确定不需要迁移,因此不会尝试进行迁移。 Example of Permission Settings Here