在EF中定义DBContext时调用基类的构造函数的原因是什么?还有其他的方式吗?

问题描述:

例如,如果我有一个类作为'MyContext',我应该通过传递connectionString来调用DbContext的构造函数。谁能告诉我为什么这样调用。我的意思是,有没有其他方式我们可以在不明确传递connectionstring的情况下派生DbContext类。这样你就可以在没有事实推导/从它继承创建一个DbContext实例在EF中定义DBContext时调用基类的构造函数的原因是什么?还有其他的方式吗?

class MyContext: DbContext 
{ 

    public MyContext(string connectionString) : base(connectionString) 
    { 

    } 
} 
+3

所以EF知道明确使用什么连接字符串,它不能神奇地知道它;-) –

+0

所以你可以连接到数据库 –

有几个构造函数重载为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就可以事先知道这些信息,并且不必再担心它了。