Sql server 实体框架连接到包含数据库用户的主数据库

Sql server 实体框架连接到包含数据库用户的主数据库,sql-server,entity-framework,Sql Server,Entity Framework,我有一本书。因为它包含在数据库中,所以不允许连接到任何其他数据库,包括master。不幸的是,实体框架似乎仍然连接到主数据库 我使用最新的Entity Framework nuget(6.2.0)创建了一个新的控制台应用程序,以确保没有其他东西连接到主数据库: static void Main(string[] args) { var connectionString = "Server=sql-azure.database.windows.net;Database='Database'

我有一本书。因为它包含在数据库中,所以不允许连接到任何其他数据库,包括master。不幸的是,实体框架似乎仍然连接到主数据库

我使用最新的Entity Framework nuget(6.2.0)创建了一个新的控制台应用程序,以确保没有其他东西连接到主数据库:

static void Main(string[] args)
{
    var connectionString = "Server=sql-azure.database.windows.net;Database='Database';User ID=Username;Password=password;Trusted_Connection=False;";
    using (var dbContext = new DbContext(connectionString))
    {
        dbContext.Database.CommandTimeout = 10 * 60;
        dbContext.Database.ExecuteSqlCommand("EXEC cleanup @Date", new SqlParameter("@Date", DateTime.UtcNow.AddMonths(-3)));
    }
}
如何强制实体框架不连接到主数据库?主数据库上的审核日志中出现故障,导致azure威胁检测关闭。

我无法重新设置:

包含的用户:

//create user joe with password ='xxxxxx'



using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;

namespace Ef6Test
{    
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "server=xxxxxxxxx.database.windows.net;database=adventureworks;uid=joe;pwd=xxxx";
            using (var dbContext = new DbContext(connectionString))
            {
                dbContext.Database.CommandTimeout = 10 * 60;
                Console.WriteLine(dbContext.Database.SqlQuery<string>("select db_name() dbname;").Single());
            }

            Console.WriteLine("Hit any key to exit");
            Console.ReadKey();
        }
    }
}
//创建密码为'xxxxxx'的用户joe
使用制度;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity;
使用System.Data.SqlClient;
使用System.Linq;
命名空间Ef6Test
{    
班级计划
{
静态void Main(字符串[]参数)
{
var connectionString=“server=xxxxxxxxx.database.windows.net;database=adventureworks;uid=joe;pwd=xxxx”;
使用(var dbContext=newdbcontext(connectionString))
{
dbContext.Database.CommandTimeout=10*60;
Console.WriteLine(dbContext.Database.SqlQuery(“select db_name()dbname;”).Single());
}
Console.WriteLine(“按任意键退出”);
Console.ReadKey();
}
}
}

在进一步研究之后,我在using语句之前禁用了数据库初始值设定项,如下所示:

Database.SetInitializer<DbContext>(null);
Database.SetInitializer(null);
使用这行代码,console应用程序将不再连接到主数据库

完整示例:

static void Main(string[] args)
{
    var connectionString = "Server=sql-azure.database.windows.net;Database='Database';User ID=Username;Password=password;Trusted_Connection=False;";
    Database.SetInitializer<DbContext>(null);
    using (var dbContext = new DbContext(connectionString))
    {
        dbContext.Database.CommandTimeout = 10 * 60;
        dbContext.Database.ExecuteSqlCommand("EXEC cleanup @Date", new SqlParameter("@Date", DateTime.UtcNow.AddMonths(-3)));
    }
}
static void Main(字符串[]args)
{
var connectionString=“Server=sqlazure.database.windows.net;database='database';User ID=Username;Password=Password;Trusted_Connection=False;”;
Database.SetInitializer(null);
使用(var dbContext=newdbcontext(connectionString))
{
dbContext.Database.CommandTimeout=10*60;
dbContext.Database.ExecuteSqlCommand(“EXEC cleanup@Date”,new SqlParameter(“@Date”,DateTime.UtcNow.AddMonths(-3));
}
}

以下内容适用于MS SQL内部部署以及SQL Azure:

use master;    
CREATE LOGIN DemoUser WITH PASSWORD = 'DemoPassword';
GO
CREATE USER DemoUser FOR LOGIN DemoUser
GO

use DemoDB;
CREATE USER DemoUser FOR LOGIN DemoUser WITH DEFAULT_SCHEMA=[dbo]
GO

ALTER ROLE db_datareader ADD MEMBER DemoUser; 
ALTER ROLE db_datawriter ADD MEMBER DemoUser; 

你的问题?你的问题?你能检查审计日志并确保它没有连接到主数据库吗?我上面发布的代码正在工作,因此不会抛出异常或任何东西。等等……那么您必须进行编码更改才能切换到包含的数据库用户?这肯定应该通过驱动程序和提供者来处理。至少在我的经验中,Entity Framework需要对master具有读访问权限,以便能够获得有关用户数据库中对象的信息。为了将包含的数据库用户帐户与实体框架一起使用,我必须在主数据库中创建一个用户,并使该用户与访问用户数据库的登录名相同。注意:无需向主数据库中的用户授予权限-必要的表已经是公共的。