我已经看过很多关于此的帖子,但我不明白如何实现这一点。
我的连接字符串在app.config中指定为“MealsContext”,我的EF数据模型容器名称是“MealsContext”,我如何使用MealsContext的实例但是定义要在运行时使用的连接字符串?如果我创建一个新的EntityConnection,它不知道模型中有哪些实体对象,例如这就是我目前正在做的......
private MealsContext context = new MealsContext();
public void InsertOrUpdate(Meal _entity)
{
context.Entry(_entity).State = _entity.Id == default(int) ? EntityState.Added : EntityState.Modified;
context.SaveChanges();
}
答案 0 :(得分:1)
以防万一其他人正在寻找这个,我从其他一些帖子中拼凑出答案,这些帖子说同样的事情,但我起初并没有得到它。我在app.config文件中添加了几个不同的命名连接字符串。然后我覆盖了实体模型中的上下文类,以便它将连接字符串的名称作为参数
public MealsContext(string connectionString) : base(connectionString)
{
}
我传入的字符串是“name = csTest”,其中csTest是app.config中定义的连接字符串。然而,诀窍是在某处单独指定此上下文 - 例如在类库文件夹中,以便在更新或重建模型时不会自动覆盖上下文。
答案 1 :(得分:1)
EF 6的数据库上下文基类DbContext
有两个重载 - 其中一个带有DbConnection
和一个布尔标志,指示前面提到的DbConnection
对象是否应该是在处理上下文时处理(IOW如果为真,则在处理上下文时处置DbConnection
)。你也可以使用构造函数重载,只需要一个连接字符串,但我想举一个例子来说明如何在控制DbConnection
对象的生命周期时这样做。
问题在于,当生成特定上下文时,默认情况下只有默认(公共/无参数)构造函数可用,如果查看生成的类,则使用基于配置文件的EF连接字符串条目。好处是你生成的继承自DbContext
的上下文遵循使用partial修饰符生成上下文类的最佳实践,这允许您创建自己的特定模型上下文的partial
实现。 / p>
我建议在项目中创建一个新的类文件(显式不是代码生成的文件),并且至少只需要一个具有{{partial
的构造函数来实现模型的上下文类的DbConnection
实现。 1}}和一个bool
参数来镜像前面提到的DbContext
构造函数签名。
例如,如果生成的上下文定义为:
public partial class MyModelContainer : DbContext...
然后你可以创建你的部分类实现(当然在你的闪亮,新的和单独的类文件中):
public partial class MyModelContainer
{
public MyModelContainer(DbConnection dbConnection, bool contextOwnsConnection)
: base(dbConnection, contextOwnsConnection)
{
// you can other stuff here if you need to, but don't have to for this example
}
}
如果你已经做到这一点,你应该能够创建MyModelContainer
个对象,其数据库连接与你提供的DbConnection
对象使用的连接字符串一样动态。
示例:
public void DynamicConnectionExample(string entityConnectionString)
{
DbConnection dbConnection = new EntityConnection(entityConnectionString);
bool shouldImplicitlyDisposeOfConnection = true;
using (var ctx = new MyModelContext(dbConnection, shouldImplicitlyDisposeOfConnection))
{
// do stuff...
}
}
显然,你可以通过各种方法来配置DbConnection对象的连接字符串,我建议您尝试这样做的方式,而不是示例中显示的方式。
另外值得注意的是:根据您使用的是模型优先还是代码优先,这会对您将要使用的DbConnection
的特殊类型产生影响。例如,如果您使用的是EF模型,则会使用EntityConnection
对象,因为您需要访问程序集中的元数据编译资源。
参考:http://msdn.microsoft.com/en-us/library/gg696604(v=vs.113).aspx