加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读