微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 实体框架代码首先 – 让它在没有drop数据库的情况下执行“CREATE SCHEMA”?

我正在努力做更好的数据整合性能和备份统一,允许单独的项目在一个数据库中使用单独的模式.

但我陷入困境,实体框架在其一个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] 举报,一经查实,本站将立刻删除。

相关推荐