问题描述:
框架采用仓储模式,dbcontext在仓储模块中。数据模型使用注释方式描述,分布在多个模块中,其中每个模块一个独立DLL。模块只能通过IOC容器获取相应的IRepository,对数据库的读写操作都正常。
问题:
当其中一个模块中的数据模型有改动后,需要对数据库进行数据迁移。根据数据迁移指令,dbcontext所在的程序集中并无数据模型,所以每次迁移都没有数据模型的更新内容,只生成了一个Configuration.cs文件。求解决方案
方法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的主项目去更新表
有没物理上控制从项目都数据库结构的更改?比如设置数据库?怎么设置?
@shiningrise:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>());
迁移属性设置为这个就可以了
如果有人改动数据库 就会报错