将aspnetdb.mdf与我自己的数据库合并(自动生成)

时间:2012-05-02 10:29:12

标签: database asp.net-mvc connection-string aspnetdb

我已经彻底搜索了互联网,但找不到问题的明确答案。我有aspnet.db数据库。但我想将自己的表和数据添加到此数据库。如果我尝试使用连接字符串连接到它:

<add name ="ToernooiCompanionDBContext" connectionString ="Data Source= .\SQLEXPRESS; Integrated Security = SSPI; Trusted_Connection=True; Initial Catalog= aspnetdb"  providerName ="System.Data.SqlClient"/>

将在C:\ Program Files \ Microsoft SQL Server \ MSSQL10.SQLEXPRESS \ MSSQL \ DATA中创建一个新数据库(aspnetdb.mdf)。

我希望数据库(由codefirst自动生成)与我的APP_DATA文件夹中的现有数据库合并。我究竟做错了什么?

我尝试将AttachDbFilename=|DataDirectory|aspnetdb.mdfUser Instance=true添加到我的连接字符串中,或​​者使用在machine.config中定义的LocalSqlServer连接字符串,但在所有情况下都会覆盖现有的数据库。如果我删除Initial Catalog=aspnetdb,那么我会收到一个错误,即需要初始目录。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,但是this链接让我在赛道上找到了至少对我有用的东西。我希望至少这对某人有帮助! :)

  1. 创建数据库
  2. 将aspnet表添加到新数据库
  3. 修复web.config中的数据库连接,使它们指向同一个数据库
  4. 编写一些删除除“aspnet _”
  5. 之外的所有表的sql
  6. 将sql添加到您自己编写的数据库初始化程序
  7. 在Global.asax.cs
  8. 中添加对数据库初始化程序的调用

    1。创建数据库

    我通常使用SQL Server Management Studio执行此操作。我用于此示例代码的数据库是SQL Server 2008R2,但我对您使用的SQL Server Express执行了相同的操作。

    2。将aspnet表添加到新数据库

    我使用以下工具,如果您在没有任何命令行参数的情况下使用它,就像向导一样工作。 %WINDIR%\ Microsoft.NET \框架\ v4.0.30319 \ aspnet_regsql.exe的

    3。修复数据库连接,使它们指向同一个数据库

    以下两行来自我制作的测试应用程序。请注意,第二个连接字符串(MyHealthContext)的名称与我用于代码优先类的DbContext的名称相同。

    的DbContext:

    public class MyHealthContext : DbContext
    {
        public DbSet<Person> People { get; set; }
        public DbSet<PersonAttribute> PeopleAttributes { get; set; }
    }
    

    的Web.config

    <add name="ApplicationServices" connectionString="Server=localhost\mssql2008r2;Database=MyHealth;Integrated Security=True;" providerName="System.Data.SqlClient"/> 
    <add name="MyHealthContext" connectionString="Server=localhost\mssql2008r2;Database=MyHealth;Integrated Security=True;" providerName="System.Data.SqlClient"/>
    

    4。删除除aspnetdb-tables之外的所有SQL

    的SQL
    DECLARE @cmdDropConstraints VARCHAR(4000)
    DECLARE @cmdDropTables      VARCHAR(4000)
    
    -- ======================================================================
    -- DROP ALL THE FOREIGN KEY CONSTRAINTS FROM THE TABLES WE WANT TO DROP
    -- ======================================================================
    DECLARE cursorDropConstraints CURSOR FOR 
        SELECT 
            'ALTER TABLE ['+ s.name + '].[' + t.name + '] DROP CONSTRAINT [' + f.name +']' 
        FROM 
            sys.foreign_keys f 
            INNER JOIN sys.tables t ON f.parent_object_id=t.object_id 
            INNER JOIN sys.schemas s ON t.schema_id=s.schema_id 
        WHERE 
            t.is_ms_shipped=0
            AND t.name NOT LIKE 'aspnet_%'
            AND t.name <> 'sysdiagrams'
    
    OPEN cursorDropConstraints
    WHILE 1=1
    BEGIN
        FETCH cursorDropConstraints INTO @cmdDropConstraints
        IF @@fetch_status != 0 BREAK
        EXEC(@cmdDropConstraints)
    END
    CLOSE cursorDropConstraints
    DEALLOCATE cursorDropConstraints;
    
    -- ======================================================================
    -- DROP ALL THE RELEVANT TABLES SO THAT THEY CAN BE RECREATED
    -- ======================================================================
    DECLARE cursorDropTables CURSOR FOR 
        SELECT 
            'DROP TABLE [' + Table_Name + ']'
        FROM 
            INFORMATION_SCHEMA.TABLES
        WHERE
            Table_Name NOT LIKE 'aspnet_%'
            AND TABLE_TYPE <> 'VIEW'
            AND TABLE_NAME <> 'sysdiagrams'
    
    OPEN cursorDropTables
    WHILE 1=1
    BEGIN
        FETCH cursorDropTables INTO @cmdDropTables
        IF @@fetch_status != 0 BREAK
        EXEC(@cmdDropTables)
    END
    CLOSE cursorDropTables
    DEALLOCATE cursorDropTables;
    

    5。数据库初始化程序的代码:

    使用步骤4中的sql替换下面的“SQL CODE GOES GOES”

    public class MyHealthInitializerDropCreateTables : IDatabaseInitializer<MyHealthContext>
    {
        public void InitializeDatabase(MyHealthContext context)
        {
            bool dbExists;
            using (new TransactionScope(TransactionScopeOption.Suppress))
            {
                dbExists = context.Database.Exists();
            }
    
            if (dbExists)
            {
                // Remove all tables which are specific to the MyHealthContext (not the aspnetdb tables)
                context.Database.ExecuteSqlCommand(@"SQL CODE GOES HERE");
    
                // Create all tables which are specific to the MyHealthContext (not the aspnetdb tables)
                var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
                context.Database.ExecuteSqlCommand(dbCreationScript);
    
                Seed(context);
                context.SaveChanges();
            }
            else
            {
                throw new ApplicationException("No database instance");
            }
        }
    
        protected virtual void Seed(MyHealthContext context)
        {
            //TODO: Add code for seeding your database with some initial data...
        }
    }
    

    6。挂钩在新数据库初始化程序中的代码

    为了确保自定义数据库初始化程序不会在生产环境中意外运行,我添加了一个#if DEBUG语句,因为我总是在发布之前以发布模式编译我的代码。

        protected void Application_Start()
        {
            //TODO: Comment out this database initializer(s) before going into production
            #if DEBUG
            Database.SetInitializer<MyHealthContext>(new MyHealthInitializerDropCreateTables()); // Create new tables in an existing database
            #endif
    
            AreaRegistration.RegisterAllAreas();
    
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    

答案 1 :(得分:0)

  1. 通过附加为新数据库
  2. 在sql server中打开ASPNetDB数据库
  3. 从ASPNetDB创建表/存储过程的创建脚本,并在您自己的数据库中运行以在数据库中创建表
  4. 打开应用程序的web.config并将应用程序附加到您自己的数据库。复制连接字符串的名称
  5. 转到会员区并将复制的串名替换为
  6. 按区域进行上述步骤