我已经看过很多关于此的文章,但我不知道如何实现。
我的连接字符串在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();
}
EF 6的数据库上下文基类DbContext
有两个重载-其中一个带有aDbConnection
和一个布尔值标志,指示DbConnection
在处置上下文时是否应处置前述对象(IOW如果为true,DbConnection
则在上下文时处置)被处置)。您还可以使用仅接受连接字符串的构造函数重载,但是我想举一个示例,说明如何在控制DbConnection
对象的生存时间的同时执行此操作。
缺点是,在生成特定上下文时,默认情况下仅默认的(公共/无参数)构造函数可用,如果您查看生成的类,则暗示使用基于配置文件的EF连接字符串条目。好处是,您生成的上下文继承自DbContext
以下最佳实践:使用partial修饰符生成上下文类,这使您可以创建自己partial
的特定模型上下文的实现。
我建议您在项目中创建一个新的类文件(明确地说不是代码生成的文件),并且至少要partial
使用仅带有的构造函数DbConnection
和一个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
将对要使用的特殊类型产生影响。例如,EntityConnection
如果您使用的是EF模型,则需要使用对象,因为需要访问程序集中的元数据编译资源。
参考:http : //msdn.microsoft.com/en-us/library/gg696604( v= vs.113).aspx
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句