所以我设法让Code First运行,它运行良好.
由于我仍在开发应用程序,因此数据库的结构尚未最终确定,因此我需要实现迁移.
我关注了官方博客帖子并获得了Update-Database命令.
但是,这只会更新数据库的SQLExpress版本.数据库的生产版本在Azure上,我在运行时指定连接字符串,因此Update-Database命令不起作用.
所以我的最后一个问题是:如何将自动迁移应用于在运行时指定连接字符串的生产数据库?
我正在编写一个与预先存在的系统集成的工资单系统.原始系统有一个处理用户管理和一些全局配置的主数据库,下面有多个数据库,每个数据库在结构上相同,基本上每个数据库都是一个公司工资单数据库,所有这些数据库都绑定到主数据库,因为它属于父数据库公司拥有许多子公司,每个子公司都有自己的人力资
我想知道的是,如果有任何方法可以,基于cookie或其他方法存储他们希望连接的公司,使用过滤器根据输入动态更改实体框架目标数据库?
这是一个例子:
用户A登录到站点,页面加载用户有权访问的可用公司,用户将选择公司,他们在该公司拥有管理员权限,他们添加员工,在该操作运行之前,asp.net将连接字符串切换到适当的数据库,然后添加记录.
public partial class ProcessContext : DbContext
{
static ProcessContext()
{
Database.SetInitializer<ProcessContext>(null);
}
public ProcessContext()
: base("Name=ProcessCS") //Comes from Config File
{
}
--DBSets
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
--Code
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个Multi Tenent DB,我们有3个不同的DB.集中式数据库位于公共位置,不会更改.这是存储其余数据库详细信息的位置.我需要创建连接字符串@ runtime,其中详细信息将来自此集中式数据库.有人可以让我知道如何去做吗?
我尝试使用以下代码,但它无法正常工作.此方法将在此处调用
public ProcessContext()
: base(nameOrConnectionString: ConnectionString())
{
}
private static string ConnectionString()
{
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
sqlBuilder.DataSource = "XXX";
sqlBuilder.InitialCatalog = "YYY";
sqlBuilder.PersistSecurityInfo = true;
sqlBuilder.IntegratedSecurity = true;
sqlBuilder.MultipleActiveResultSets = true;
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.ProviderConnectionString = sqlBuilder.ToString();
entityBuilder.Metadata = "res://*/"; …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个易于理解的DBContext类,它采用自定义连接字符串,可以运行迁移,并且我允许使用包管理器生成迁移.
我好像在四处走动.
我已经能够使用对我来说非常糟糕的代码来使用它.我在关于连接字符串和迁移的这个问题的答案中记录了这一点.
Radek的答案看起来比我的好,但是我发现当我实现它然后尝试在Package Manager中创建一个迁移时,我得到了消息
目标上下文'DataLayer.Context'不可构造.添加默认构造函数或提供IDbContextFactory的实现.
DataLayer.Context我的上下文类在哪里.
我不想提供一个实现IDbContextFactory(并且Radek的答案似乎表明它不需要)
更新:
如果我包含一个没有参数的构造函数,我可以生成一个迁移.例如
public Context() : base("ConnectionStringName") { }
Run Code Online (Sandbox Code Playgroud)
对于我的上下文创建,我在app.config中传递连接字符串的名称
public Context(string connString) : base(connString)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}
Run Code Online (Sandbox Code Playgroud)
最后,我既可以生成迁移,也可以为用户选择的数据库运行迁移.
但是:当我删除数据库然后运行我的应用程序时,我遇到了问题.
我正在使用的初始化代码,来自上面的链接
public class CustomInitializer : IDatabaseInitializer<Context>
{
public void InitializeDatabase(Context context)
{
try
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
if (!context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase =
new DbConnectionInfo(context.Database.Connection.ConnectionString);
IEnumerable<string> migrations = migrator.GetPendingMigrations();
foreach …Run Code Online (Sandbox Code Playgroud) 我希望有人能够帮助我,因为我似乎完全陷入困境.
对于我们公司即将开展的项目,我们希望使用Entity Framework 5和代码优先方法.我玩了一会儿,每当我尝试在我们现有的库中使用EF时,我都失败了,因为看起来EF很大程度上依赖于现有的app.config.
在我们公司,我们有一个内部数据库库,允许我们利用MEF(托管扩展性框架)的优势连接到各种数据源和数据库技术,用于数据库提供程序.我只需要传递一些数据库设置,例如主机(或文件),目录,用户凭据和数据库提供程序名称,库会查找相应的插件并返回自定义连接字符串或IDbConnection.我们希望将此库与EF一起使用,因为它允许我们灵活地使用我们使用的数据库,并在运行时更改数据库.
所以.我看到一个典型的DbContext对象在构造函数中没有参数.它会自动在app.config中查找相应的连接字符串.我们不喜欢这样的东西所以我改变了默认构造函数来获取一个DbConnection对象,该对象被传递给DbContext基类.没有成交.
代码第一个模型更改时出现问题.EF会自动注意到这一点并查找迁移类/配置.但是:典型的迁移类需要上下文的默认无参数构造函数!太遗憾了!
因此,我们使用IDbContextFactory接口构建自己的迁移类.但同样,似乎这个IDbContextFactory也需要一个无参数构造函数,否则我无法添加迁移或更新数据库.
此外,我创建了自己的数据迁移配置程序,我传递了上下文,也是目标数据库.问题在于:无论我尝试什么,它都找不到任何迁移类.
我完全陷入困境,因为似乎使用EF的唯一方法是在app.config中保存连接字符串.这是愚蠢的,因为我们需要在运行时更改数据库连接,app.config对于默认用户是只读的!
怎么解决这个?
我正在尝试编写一个方法来创建数据库并在给定连接字符串的情况下对其运行迁移.
我需要多个连接,因为我在单独的数据库中记录审计日志.我使用类似的代码从app.config中获取连接字符串
ConfigurationManager.ConnectionStrings["Master"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)
代码使用我的app.config中定义的第一个连接字符串而不是其他连接字符串,这使我认为它以某种方式从app.config获取连接字符串我不知道.
如果不存在,我创建数据库的代码是
private static Context MyCreateContext(string ConnectionString)
{
// put the connection string where the factory method can get it
AppDomain.CurrentDomain.SetData("ConnectionString", ConnectionString );
var factory = new ContextFactory();
// I know I need this line - but I cant see how what follows actually uses it
Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context,DataLayer.Migrations.Configuration>());
var context = factory.Create();
context.Database.CreateIfNotExists();
return context
}
Run Code Online (Sandbox Code Playgroud)
Migrations.Configuration中的代码是
Public sealed class Configuration : DbMigrationsConfiguration<DataLayer.Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
}
Run Code Online (Sandbox Code Playgroud)
上下文工厂代码是
public class ContextFactory : …Run Code Online (Sandbox Code Playgroud) 我有一个继承自抽象基础的上下文类AuditableDbContext : DbContext.在AuditableDbContext有两个参数,一个是审计师和一个用于审计到的上下文.
在继承的类中,我有一个默认的无参数构造函数,它使用null参数调用其他构造函数,然后在Database.SetInitializer<MyDbContext>(null)调用基础构造函数后调用的最终构造函数中.
问题是即使我这样做,我仍然在应用程序启动时在数据库服务器上获得db迁移调用.
public abstract class AuditableContext : DbContext
{
public AuditableContext(IAuditor auditor, DbContext auditContext)
{
// params can be null resulting in no auditing
// initialization stuff here...
}
}
public class MyDbContext : AuditableContext
{
// DbSets here...
public MyDbContext() : this(null, null) {}
public MyDbContext(IAuditor auditor) : this(auditor, null) {}
public MyDbContext(IAuditor auditor, DbContext auditContext)
: base(auditor, auditContext)
{
Database.SetInitializer<MyDbContext>(null);
}
}
Run Code Online (Sandbox Code Playgroud)
我在数据库中看到的查询是两个常见的迁移查询...
SELECT [GroupBy1].[A1] AS [C1]
FROM ( …Run Code Online (Sandbox Code Playgroud) 在我们的生产环境中,我们有一个自动部署脚本,用于关闭我们的站点,运行迁移,然后将其重新联机.我们希望避免在没有任何需要运行的迁移时切换到新代码来关闭网站.
实体框架是否有像"Update-Database"这样的命令,可以让我们检查是否有要运行的迁移?
c# ×3
.net ×2
.net-4.5 ×1
app-config ×1
asp.net-mvc ×1
code-first ×1
dbcontext ×1
linq ×1
migration ×1