Sql server 实体框架连接到包含数据库用户的主数据库
我有一本书。因为它包含在数据库中,所以不允许连接到任何其他数据库,包括master。不幸的是,实体框架似乎仍然连接到主数据库 我使用最新的Entity Framework nuget(6.2.0)创建了一个新的控制台应用程序,以确保没有其他东西连接到主数据库: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'
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具有读访问权限,以便能够获得有关用户数据库中对象的信息。为了将包含的数据库用户帐户与实体框架一起使用,我必须在主数据库中创建一个用户,并使该用户与访问用户数据库的登录名相同。注意:无需向主数据库中的用户授予权限-必要的表已经是公共的。