c# - Entity Framework 代码优先 - 让它在不删除数据库的情况下执行 "CREATE SCHEMA"?

标签 c# entity-framework-6

我正在尝试通过允许单独的项目在一个数据库中使用单独的模式来实现更好的数据整合性能和备份统一性。

但我被卡住了, Entity Framework 在其一个 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, UPDATE, INSERT, DELETE, 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, UPDATE, INSERT, DELETE, EXECUTE on SCHEMA::b1 to blog1');" +
            "END";
context.Database.ExecuteSqlCommand(command);

关于c# - Entity Framework 代码优先 - 让它在不删除数据库的情况下执行 "CREATE SCHEMA"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30502469/

相关文章:

powershell - PowerShell 中的 EF6 添加迁移,在 Visual Studio 之外

c# - 已发布的 ASP.NET MVC 网站中的计时器问题

c# - 调用异步方法时使用 .Wait() 的情况是什么

entity-framework-6 - DbContext的通用合并: how to check if entity is all ready attached?

c# - ASP :ImageButton OnClick event not firing in IE

c# - 在使用 XAML Islands 的 WPF 应用程序中托管 UWP 控件的 Windows 10 真正最低支持版本是什么?

c# - 查找以下划线开头的单词

c# - 具有不变名称 'MySql.Data.MySqlClient' 的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册

c# - 如何在条件语句中使用 Linq 的 .Count() 方法

Exchange 2013 上的 C# EWS Api : Get an attachment into a Stream