c# – 实体框架代码首先 – 让它在没有drop数据库的情况下执行“
发布时间:2020-12-15 22:14:50 所属栏目:百科 来源:网络整理
导读:我正在努力做更好的数据整合性能和备份统一,允许单独的项目在一个数据库中使用单独的模式. 但我陷入困境,实体框架在其一个Database.Create()函数中执行两个问题 – 数据库创建然后创建表对象 – 这一点. 有没有办法在没有数据库重新创建的情况下获取表对象创
我正在努力做更好的数据整合性能和备份统一,允许单独的项目在一个数据库中使用单独的模式.
但我陷入困境,实体框架在其一个Database.Create()函数中执行两个问题 – 数据库创建然后创建表对象 – 这一点. 有没有办法在没有数据库重新创建的情况下获取表对象创建活动?我希望每个项目共享一个数据库,但具有明确定义的模式所有权. 此代码的主要项目是首先使用代码,因此我们的团队可以同时处理模型的各个部分.此外,该项目不使用迁移,因为我们已在所有部署中使用智能默认设置进行生产. 下面是我到目前为止创建的代码. “// TODO:”部分是我被卡住的地方. 问候 namespace app1.Models { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure.Interception; using System.Diagnostics; using System.Linq; public class Model1 : DbContext { public Model1() : base("name=Model1") { // Log database activity this.Database.Log = DebugWrite; } private void DebugWrite(string s) { Debug.Write(s); } // Avoiding Compiler Error CS1618 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("b1"); base.OnModelCreating(modelBuilder); } //public virtual DbSet<blog1> blog1 { get; set; } //public virtual DbSet<common> common { get; set; } } public class DbB1SchemaInitializer : IDatabaseInitializer<Model1> { public void InitializeDatabase(Model1 context) { context.Database.Log = DebugWrite; if (context.Database.Exists()) { if (!context.Database.CompatibleWithModel(true)) { context.Database.Delete(); // TODO: remove this and make delete the schema and its objects context.Database.Create(); // TODO: remove this and make delete the schema and its objects // Reinstall,create schema and application role. context.Database.ExecuteSqlCommand("CREATE SCHEMA b1"); context.Database.ExecuteSqlCommand("CREATE APPLICATION ROLE blog1 WITH PASSWORD = 'Pwd0123456',DEFAULT_SCHEMA = b1"); context.Database.ExecuteSqlCommand("GRANT SELECT,UPDATE,INSERT,DELETE,EXECUTE on SCHEMA::b1 to blog1"); } } else { // Fresh install,create the database,schema and application role. context.Database.Create(); // Create will make database and make the tables. context.Database.ExecuteSqlCommand("CREATE APPLICATION ROLE blog1 WITH PASSWORD = 'Pwd0123456',DEFAULT_SCHEMA = b1"); context.Database.ExecuteSqlCommand("GRANT SELECT,EXECUTE on SCHEMA::b1 to blog1"); } // Do database connection interception so database application security is used rather than database user security from this point on. //DbInterception.Add(new EFDBConnectionApplicationRoleInterception("blog1","Pwd0123456")); } private void DebugWrite(string s) { Debug.Write(s); } // Avoiding Compiler Error CS1618 } } 解决方法
我不清楚你为什么要这样做,但是如果重新构建模式,也许这可以帮助你:
var command = "IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'b1')) " + "BEGIN" + " EXEC ('CREATE SCHEMA B1');" + " EXEC ('CREATE APPLICATION ROLE blog1 WITH PASSWORD = ''Pwd0123456'',DEFAULT_SCHEMA = b1');" + " EXEC ('GRANT SELECT,EXECUTE on SCHEMA::b1 to blog1');" + "END"; context.Database.ExecuteSqlCommand(command); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |