我正在努力做更好的数据整合性能和备份统一,允许单独的项目在一个数据库中使用单独的模式.
但我陷入困境,实体框架在其一个Database.Create()函数中执行两个问题 – 数据库创建然后创建表对象 – 这一点.
有没有办法在没有数据库重新创建的情况下获取表对象创建活动?我希望每个项目共享一个数据库,但具有明确定义的模式所有权.
此代码的主要项目是首先使用代码,因此我们的团队可以同时处理模型的各个部分.此外,该项目不使用迁移,因为我们已在所有部署中使用智能默认设置进行生产.
下面是我到目前为止创建的代码. “// T@R_502_6487@:”部分是我被卡住的地方.
问候
伊恩
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(); // T@R_502_6487@: remove this and make delete the schema and its objects context.Database.Create(); // T@R_502_6487@: 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。