C# 在EF中动态设置数据源
我使用的是EF6,我有两个不同版本的数据库(MsSQL)。 1个版本有一个table Person,而另一个版本没有。 我正在重写ModelCreating上的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
,并使用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();
}