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

时间:2012-08-28 11:16:43

标签: c# asp.net-mvc-3 code-first

我对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”。它是包含生成的表的那个......

我想知道这个名字的来源,我怎么能这样做所有生成的表只用我指定的名字进入我的connectionstring。我只想要一个数据库。我确定它只是上下文中的一个标签,但我无法在谷歌上找到这些信息。

编辑:在一个烦恼中,我希望我的数据库继续使用DropCreateDatabaseIfModelChanges<RecettesMaisonContext>,但我希望它创建一个具有连接字符串中指定名称的数据库,这不是case(使用命名空间和数据库上下文的名称创建名称)

谢谢!

2 个答案:

答案 0 :(得分:1)

这是因为你没有找到你的数据库的连接字符串,所以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);
        }
    }

    ...
}

答案 1 :(得分:1)

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

Database.SetInitializer<YourDataContext>(null);

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