【问题标题】:Permission to drop database with DropCrateDatabaseIfModelChanges<>使用 DropCrateDatabaseIfModelChanges<> 删除数据库的权限
【发布时间】:2016-02-26 13:08:49
【问题描述】:

我正在构建一个 MVC 解决方案,但我无法修改我的模型而不会出现数据库错误。

我的初始化程序如下所示:

public class Initializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
    protected override void Seed(DatabaseContext context)
    {
        ...
    }
}

错误提示:

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

附加信息:无法删除数据库“hemabiobank”,因为它不存在或您没有权限。

如何获得删除数据库的权限?是服务器提供商让我下不了吗?

附带问题:如何避免在修改模型时丢失数据?

【问题讨论】:

    标签: c# sql model-view-controller


    【解决方案1】:

    删除数据库的权限可能来自很多方面。我能想到的一个是您用来访问数据库的权限不允许您删除数据库。您是否能够使用这些权限登录管理工作室并通过 SQL 删除数据库。

    在修改模型时避免丢失数据方面,你对种子模型的思考是正确的,但你也可以使用数据库迁移:

    我在另一个问题上写了以下内容,但在这里也很有用:

    迁移提供了一种在不丢失所有现有基础架构的情况下更新表/列等的方法。

    为了能够使用迁移修改您的代码优先数据库,您首先需要启用它们。为此,只需在 NuGet 包控制台中键入 Enable-Migrations 并按回车键。完成此操作后,您可以对类、数据库集、上下文等进行任何类型的更改,然后通过键入 add-migration(此处为迁移名称)来更新它们。完成此操作后,您会注意到在您的项目中创建了一个名为“Migrations”或类似名称的文件夹。在此您将看到一些 .cs 文件,这些文件代表您想要更新数据库时将应用的代码。要在添加迁移后物理更新数据库,您需要在控制台中运行 Update-Database 命令。这将改变数据库结构,而不会丢失您已经取得的一切。

    您为每个迁移命名的原因是您可以在迁移之间进行交换,因此您可以返回特定更改并在需要时撤消进一步的更改。这就是为什么您会在 Migrations 文件夹中为添加的每个迁移找到一个单独的 .cs 文件,因此它知道如何应用更改。

    您还会注意到在您的数据库中创建了一个迁移历史表,这也代表了您的更改,它记录了迁移时数据库的状态。

    【讨论】:

    • 我收到此消息:“消息 3701,级别 11,状态 1,第 5 行无法删除数据库 'HemaBiobank',因为它不存在或您没有权限。”那我需要联系供应商吗?
    • 如果您可以验证它确实存在并且您没有在任何地方打错字,那么我会联系提供商,因为您的连接权限不允许实体框架启动删除查询。但是,看看您是否可以执行迁移会很有趣。将数据播种到新数据库中,但通常用于重新填充样本数据。迁移允许在对模型进行更改时保留结构和数据。
    • 非常感谢,奥利弗。在联系提供商之前,我会尝试播种。
    • 你是说迁移? :P
    • 它就像一个魅力。非常感谢。编辑:是的,这就是我要说的。 :p
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多