C# 在EF中动态设置数据源

C# 在EF中动态设置数据源,c#,entity-framework,dbset,C#,Entity Framework,Dbset,我使用的是EF6,我有两个不同版本的数据库(MsSQL)。 1个版本有一个table Person,而另一个版本没有。 我正在重写ModelCreating上的,并使用modelBuilder.Ignore() 这适用于为其他表调用数据库。 我想要完成的是,当我通过EF调用实体时,它返回类Person的新实例,而不是尝试连接到DB并获取其数据 例如: 我假设您可以将布尔参数添加到上下文的构造函数中: public MyEntity(string connectionString, bool in

我使用的是EF6,我有两个不同版本的数据库(MsSQL)。 1个版本有一个table Person,而另一个版本没有。 我正在重写ModelCreating上的
并使用
modelBuilder.Ignore()
这适用于为其他表调用数据库。
我想要完成的是,当我通过EF调用实体时,它返回类Person的新实例,而不是尝试连接到DB并获取其数据

例如:


我假设您可以将布尔参数添加到上下文的构造函数中:

public MyEntity(string connectionString, bool includePerson)
{
    _includePersion = includePerson;
}
现在,上下文可以有一个属性
Person
,或者最好是复数形式
People

public IQueryable<Person> People
{
    get => _includePerson 
        ? Set<Person>()
        : (new[] { new Person() }).AsQueryable();
}
公共可访问人员
{
get=>\u includePerson
?集()
:(new[]{new Person()}).AsQueryable();
}

从技术上讲,您现在应该脱离困境了,因为没有到
Person
的导航属性。然而,我担心这种结构可能会给下游带来比乍一看预期的更多的后果。我会尽一切努力避免它。在数据库中添加一个空的
Person
表而不添加它会更好。这甚至可以由应用程序本身完成,前提是登录的数据库用户具有所需的DDL权限。

这是版本控制问题,而不是数据源问题。您已经在提供的代码中动态设置了数据源。为什么要返回一些随机对象,而不是执行迁移来创建新表?也许您需要的是不同版本的不同上下文?@PanagiotisKanavos:DB有2300多个表,我不想为每个版本(10多个版本)创建不同的上下文。数据库也在MsSql和MySQL中,我知道问题是关于MsSql的,但我必须考虑到这一点。此外,当我创建一个不同的上下文时,对Person实体的调用会发生什么变化?例如:如果Person未在DB ent.Person.FirstOrDefault中激活,则抛出错误您是否有任何指向
Person
的导航属性?这将使这变得非常困难。@GertArnold目前没有。它是一个平面模型数据库,我使用automapper在我的存储库之外创建一个逻辑模型。所以他们的repo只是愚蠢的数据检索。在我看来,是否映射
Person
的决定(即一些布尔值)也可以用于从上下文返回
DbSet
或伪
IQueryable
。@GertArnould:这正是我要找的。我知道这会带来很多后果,但我无法将空表添加到Db中,也看不到任何其他解决问题的方法
public IQueryable<Person> People
{
    get => _includePerson 
        ? Set<Person>()
        : (new[] { new Person() }).AsQueryable();
}