ASP .NET MVC 3实体框架禁用代码优先

时间:2011-05-15 00:53:32

标签: asp.net-mvc-3

我正在做ASP .NET MVC3音乐商店教程而不是连接到附加数据库EF正在SQLEXPRESS中创建一个新数据库(代码优先)。如何防止这种情况发生。使用EF的配置应该连接到现有数据库 - 而不是创建新数据库。 我有一个DbContext类,如下所示

using System.Data.Entity;
namespace MusicStore.Models
{
    public class MusicStoreEntities:DbContext
    {
        public DbSet<Album> Albums { get; set; }   
        public DbSet<Genre> Genres { get; set; }
    }
}

我的web.config有以下连接字符串

<connectionStrings>
    <add name="MusicStoreEntities"
         connectionString="data source=.\SQLEXPRESS;         Integrated Security=SSPI;       
         AttachDBFilename=|DataDirectory|\MvcMusicStore.mdf;       User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

2 个答案:

答案 0 :(得分:4)

在Application_Start()中,将数据库初始化策略设置为:

DbDatabase.SetInitializer<MusicStoreEntities>(
         new CreateDatabaseIfNotExists<MusicStoreEntities>());

这将使用默认初始化程序,并且只有在找不到数据库时才会创建数据库。实际上有三种可能性:

  • CreateDatabaseIfNotExists
  • DropCreateDatabaseAlways
  • DropCreateDatabaseIfModelChanges

您也可以在Application_Start()

中使用它来进行一些自定义初始化
Database.SetInitializer<MusicStoreEntities>(new MusicStoreEntityInitializer());

然后,根据您的需要添加一个派生自三种初始化类型之一的新类。

namespace MusicStore.Models
{
  public class MusicStoreEntityInitializer : 
           CreateDatabaseIfNotExists<MusicStoreEntityInitializer> 
  {
      protected override void Seed(MusicStoreEntity context)
      {
         base.Seed(context);

         // your code to populate db with test data
      }
  } 
}

通过这种设置,您可以获得很大的灵活性。

答案 1 :(得分:3)

尝试在db上下文的构造函数或Application_Start

中设置null初始值设定项
public class MusicStoreEntities: DbContext
{
    public DbSet<Album> Albums { get; set; }   
    public DbSet<Genre> Genres { get; set; }

    public MusicStoreEntities(string connectionString): base(connectionString)
    {
        Database.SetInitializer<MusicStoreEntities>(null);
   }
}

这是一个很好的tutorial你可能会看一下EF Code First。这里有一个blog post解释了不同的初始化选项。