在EF中定义DBContext时调用基类的构造函数的原因是什么?还有其他的方式吗?
问题描述:
例如,如果我有一个类作为'MyContext',我应该通过传递connectionString来调用DbContext的构造函数。谁能告诉我为什么这样调用。我的意思是,有没有其他方式我们可以在不明确传递connectionstring的情况下派生DbContext类。这样你就可以在没有事实推导/从它继承创建一个DbContext
实例在EF中定义DBContext时调用基类的构造函数的原因是什么?还有其他的方式吗?
class MyContext: DbContext
{
public MyContext(string connectionString) : base(connectionString)
{
}
}
答
有几个构造函数重载为DbContext
DbContext
不是抽象的。 在这种情况下,您需要连接字符串或类似信息。 See the full overload list here
但是当你从DbContext
派生你其实可以创建一个参数的构造函数为您MyContext
类,如果你甚至不会调用构造函数base
。默认DbContext
构造函数是受保护的,所以它会被调用,如果你不指定base
超载
其实,我见过和使用这样的代码:
public class MyDbContext : DbContext
{
public static Func<string> ConnectionStringProvider =() => "TheNameOfTheConnectionString";
public MyDbContext() : base(ConnectionStringProvider())
//....
}
凡ConnectionStringProvider
委托是在单位/集成测试所取代,因为它是一个静态字段(我不鼓励的做法,但我已经看到了它)
例如:
MyDbContext.ConnectionStringProvider =() => "MyTestConnectionStringName";
using (var ctx = new MyDbContext())
{
// This code will use conn string named MyTestConnectionStringName
}
但我猜99%的时间,正如亚历山大所说,你只是想用连接字符串调用基础构造函数,这样EF就可以事先知道这些信息,并且不必再担心它了。
所以EF知道明确使用什么连接字符串,它不能神奇地知道它;-) –
所以你可以连接到数据库 –