EF6使用相同类型的多个表

时间:2014-07-08 23:42:20

标签: c# sql sql-server entity-framework partitioning

我有一个名为“Thing”的表,其中包含列ID(guid)和JunkLevel(可以是0,1或2),以及其他20个。每天添加超过一百万行。大约70%是JunkLevel 0,1%JunkLevel 1,其余是JunkLevel 2.

我们决定创建3个表来包含东西:Junk0Thing,Junk1Thing,Junk2Thing并删除JunkLevel列。这是为了表现,因为我们想用Junk1Things做特殊的事情,但是行数会让所有其他东西变得很痛苦。

我们希望Entity Framework公开3个DbSets(Junk0Things,Junk1Things,Junk2Things),但只有一个C#类类型,“Thing”。我无法弄清楚如何做到这一点。我使用设计器将Thing实体映射到多个表,但这使得它将数据保存到每个表中。我添加了单独的DbSet,但它们都使用了Junk0Thing表。我找不到任何属性来解决这个问题。

我该如何处理?有没有办法实现这个仍然保持设计师?其他团队成员高度重视模型更新向导,如果我打破了它,将会感到不满。

遗产值得研究吗?我想避免这种情况,因为有时对象会从一个表移动到另一个表(Junk0Thing到Junk1Thing),我想避免维护代码来记住复制每个字段。

1 个答案:

答案 0 :(得分:2)

您无法将单个类型映射到多个表。

但是,您可以继承:

public abstract class JunkThing { }

public class Junk0Thing : JunkThing { }

public class Junk1Thing : JunkThing { }

public class Junk2Thing : JunkThing { }

这允许Entity Framework为不同的表创建不同的模型,同时允许您为所有目的使用基类型JunkTable。

要在类型之间进行复制,您需要实现以下内容:

public abstract class JunkThing
{
     public TJunkThing CopyTo<TJunkThing>(TJunkThing destination) where TJunkThing : JunkThing
     {
          destination.Value1 = Value1;
          destination.Value2 = Value2;
     }

}