首页 新闻 会员 周边

EF6 数据迁移,求解决方案

0
悬赏园豆:60 [待解决问题]

问题描述:

   框架采用仓储模式,dbcontext在仓储模块中。数据模型使用注释方式描述,分布在多个模块中,其中每个模块一个独立DLL。模块只能通过IOC容器获取相应的IRepository,对数据库的读写操作都正常。

  问题:

     当其中一个模块中的数据模型有改动后,需要对数据库进行数据迁移。根据数据迁移指令,dbcontext所在的程序集中并无数据模型,所以每次迁移都没有数据模型的更新内容,只生成了一个Configuration.cs文件。求解决方案

牛!的主页 牛! | 初学一级 | 园豆:21
提问于:2016-06-22 10:50
< >
分享
所有回答(1)
0

 

方法1:

去掉迁移 属性

改用sql 控制  用sql来更新表 

   protected void _Init<TContext, TMigrationsConfiguration>(DatabaseInitializer databaseInitializer)
            where TContext : global::System.Data.Entity.DbContext
            where TMigrationsConfiguration : global::System.Data.Entity.Migrations.DbMigrationsConfiguration<TContext>, new()
        {
            if ((int)databaseInitializer != 0)
            {
                switch (databaseInitializer)
                {
                    case DatabaseInitializer.CreateDatabaseIfNotExists:
                        Database.SetInitializer(new CreateDatabaseIfNotExists<TContext>());
                        break;
                    case DatabaseInitializer.DropCreateDatabaseAlways:
                        Database.SetInitializer(new DropCreateDatabaseAlways<TContext>());
                        break;
                    case DatabaseInitializer.DropCreateDatabaseIfModelChanges:
                        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<TContext>());
                        break;
                    case DatabaseInitializer.MigrateDatabaseToLatestVersion:
                        Database.SetInitializer(new MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>());
                        break;
                }
            }
            else
            {
                Database.SetInitializer<TContext>(null);
            }

用这个

Database.SetInitializer<TContext>(null);

方法2:

确定一个主项目 所有的更新 从主项目里面出 其他的项目都是引用主项目的dll

并且设置验证为 Database.SetInitializer<TContext>(null);

主项目设置验证为 Database.SetInitializer(new MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>());

 

给个场景就是 我自己的passport 其他的项目都要用

但是其他项目只引用passport的 dll 所以无论其passport 的库怎么更新 都不应该影响原来已经发布出去的 dll 所以 其他的项目在 引用passport的时候将 更新验证设置为 false 不验证

而只有passport 自己要更新了 才去更新passport的主项目去更新表

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-06-22 11:19

有没物理上控制从项目都数据库结构的更改?比如设置数据库?怎么设置?

支持(0) 反对(0) shiningrise | 园豆:216 (菜鸟二级) | 2016-07-16 03:47

@shiningrise: 

Database.SetInitializer(new MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>());

迁移属性设置为这个就可以了 

如果有人改动数据库 就会报错

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-07-18 18:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册