用 MVC3 创建的第二个数据库,如何防止?

Posted

技术标签:

【中文标题】用 MVC3 创建的第二个数据库,如何防止?【英文标题】:Second database created with MVC3, how to prevent? 【发布时间】:2012-08-28 11:16:42 【问题描述】:

我对 MVC 3 非常陌生,但我在使用 Code First 方法时遇到了问题。我创建了 2 个模型、一个上下文、视图等,并且一切正常(能够添加、删除等)

但是当我检查 Microsoft SQL Management Studio 时,我看到了 2 个数据库。其中之一是我在 web.config 中要求的。这个只包含会员表

<connectionStrings>
<add name="RecettesMaison" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=RecettesMaison;User Id=user;Password=password;"
     providerName="System.Data.SqlClient"/>

第二个有一个奇怪的名字:“RecettesMaison.DB.RecettesMaisonContext”。它是包含生成表的那个...

我想知道这个名字是从哪里来的,我该怎么做才能让所有生成的表都以我指定的名字进入我的连接字符串。我只想要一个数据库。我确定这只是上下文中某处的一个标签,但我在 google 上找不到此信息。

编辑: 简而言之,我希望我的数据库继续使用DropCreateDatabaseIfModelChanges&lt;RecettesMaisonContext&gt;,但我希望它使用连接字符串中指定的名称创建数据库,但事实并非如此(它使用命名空间和数据库上下文的名称创建一个名称)

谢谢!

【问题讨论】:

msdn.microsoft.com/en-us/library/gg679461(v=vs.103).aspx - 只需执行 Database.SetInitializer(null);这将覆盖该行为 谢谢,我今晚试试。你能写一个真实的答案而不是评论,这样我就可以给你一个好的答案了吗? 【参考方案1】:

这是因为您没有为您的数据库找到文件的 connectionString,所以 CodeFirst 使用 DbContext 所在文件名的完整命名空间自动创建一个。

通过将 filename.mdf 更改为所需的文件名,在 connectionString 中插入此文本:AttachDBFilename=|DataDirectory|filename.mdf。数据库文件将位于您的 project\App_Data 文件夹中。

你会得到这样的东西:

<connectionStrings>
    <add name="RecettesMaison" connectionString="Data Source=.\SQLEXPRESS;Initial catalog=RecettesMaison;AttachDBFilename=|DataDirectory|filename.mdf;User Id=user;Password=password;" providerName="System.Data.SqlClient"/>
</connectionStrings>

通过在 DbContext 构造函数中传递 connectionStringName 来确保您的 DbContext 使用正确的 connectionString,如下所示:

public class RecettesMaisonContext : DbContext

    public RecettesMaisonContext()
        : base("RecettesMaison")
    
    

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        var typesToRegister =
            Assembly.GetExecutingAssembly().GetTypes().Where(
                type =>
                type.BaseType.IsGenericType &&
                type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));

        foreach (object configurationInstance in typesToRegister.Select(Activator.CreateInstance))
        
            modelBuilder.Configurations.Add((dynamic)configurationInstance);
        
    

    ...

【讨论】:

我的 App_Data 文件夹中没有任何内容,因为我的数据库托管在 Management Studio 附带的 SQL Server Express 中(不在 Visual Studio 中)。还有其他想法吗? 你能确认你的 DbContext 使用了正确的 connectionString 吗?如果您在 DbContext 的构造函数中传递了 connectionStringName,请告诉我。如果没有,就在那里做。 您有任何示例说明如何执行此操作,因为现在,我的 DBContext 没有构造函数。它只有 OnModelCreating 的覆盖 谢谢!但是现在当我执行 SaveChange() 时,我得到一个异常 (DbUpdateException),就像没有表一样......我即将放弃:( 这是因为您的数据库已经创建并且 CodeFirst 不知道要在您的架构中添加或更新什么。如果可以,请删除您的数据库并让 CodeFirst 自己创建它。或者,手动将表添加到数据库中。【参考方案2】:

默认情况下,代码首先会为您创建一个数据库。但是,如果您想覆盖此行为,只需使用

Database.SetInitializer<YourDataContext>(null);

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

【讨论】:

这不起作用。我希望创建或删除我的数据库,但使用连接字符串中指定的名称。我认为这很正常,因为生产服务器上的用户无法创建数据库,但可以使用现有数据库。此外,“自动”名称一点也不有趣。还有其他想法吗?

以上是关于用 MVC3 创建的第二个数据库,如何防止?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Index.cshtml MVC3 上显示两个 Partials 视图数据?

如何从 Firebase 中的第二个生成的密钥获取数据?

如何将两个熊猫列混合到一个数据框中,第一列的第一个元素,第二列的第二个元素等等? [复制]

使用 MS Access SQL 查询创建与现有表具有一对一关系的第二个表

如何使用 json 原始数据在 vuejs 中制作依赖的第二个列表?

如何在Ajax的第二个请求中修复数据库中插入的0值?