TLDR:我有两个具有相同定义的表,我需要根据某个开关从一个表或中拉出。
例如,假设一个表包含一堆“泛型” FooItem
和一个表包含“ Fancy” FooItem
...,并且两个表之间的唯一区别是名称{{ 1}}和SIMPLE_FOO
根据布尔值(例如FANCY_FOO
),我应该从GetFancy == true
中读取,否则,请从FANCY_FOO
中读取。
这在SIMPLE_FOO
中变得很复杂。我的上下文中不能有多个DbContext
,并且不能动态地将DbSet<FooItem>
中的表名“注入” ...并且我不想复制整个dbContext只是在那里有一个不同的表名。
我确定解决方案很简单,但我只是没有看到它。感谢您的协助。
编辑:我无法更改数据库。这是一种愚蠢的方式,但是那是他们做到的方式,我必须忍受它。
答案 0 :(得分:0)
解决方案中只有两个实体,每个表一个。它们可以从基类继承,因为它们是相同的。创建具有两个表中所有字段的基类“ BaseFooItem”。然后为每个变量(Simple和Fancy)创建一个实体类,并注释每个变量以匹配必要的表名;例如:
[Table("SIMPLE_FOO")]
public class SimpleFooItem: BaseFooItem {
}
如果您不想使用数据注释,也可以使用FluentAPI设置表名称。然后为每个实体创建一个DbSet:
public DbSet<SimpleFooItem> SimpleFooItems { get; set; }
public DbSet<FancyFooItem> FancyFooItems { get; set; }
然后根据条件在每个DbSet之间进行切换,例如:
if (GetFancy) {
return dbContext.FancyFooItems.SingleOrDefault(a => a.Id == id);
} else {
return dbContext.SimpleFooItems.SingleOrDefault(a => a.Id == id);
}
希望我能正确理解您的需求。
答案 1 :(得分:0)
在我看来,最简单的方法是利用.FromSql()
方法并使用该方法来选择哪个表:
var foos = GetFancy
? dbContext.FromSql(select * from FANCY_FOO)
: dbContext.FromSql(select * from SIMPLE_FOO)
return foos.Where(/* etc /*)