我对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(使用命名空间和数据库上下文的名称创建名称)
谢谢!
答案 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