具有复杂类型继承和预先加载的Linq-to-SQL(DataLoadOptions LoadWith)

时间:2014-02-09 22:39:12

标签: inheritance linq-to-sql

这似乎是一个常见的问题,但我找不到任何可以让我得到我想要的解决方案。

我有一个数据库,其中包含我的应用程序实体的主表。该表具有“类型”列,L2S使用discriminator属性值实例化正确的派生类。我有大约10种不同的实体类型,具有一些继承级别。这非常有效。

我希望有一种方法来创建一些“GetEntityById()”,甚至可能是一个“GetAllEntities()”函数,这些函数读取数据库并返回一个完全加载的实体,在datacontext关闭后可以离线使用,所以我需要渴望加载一些关系。这是我使用L2S DataLoadOptions的地方。

根据实体的类型,加载不同的东西。加载的一些东西也使用类型继承映射

例如,我希望能够做到这一点:

options.LoadWith<Entity>(p => p.CommonClass);
options.LoadWith<DerivedEntity1>(p => p.Foo);
options.LoadWith<DerivedEntity2>(p => p.Bar);
options.LoadWith<Bar>(p => p.EvenMoreSpecificClass);
options.LoadWith<DerivedBar>(p => p.EvenMoreSpecificClass2);

现在,当然,如果我加载DerivedEntity1类型的实体,我不希望加载EvenMoreSpecificClass / EvenMoreSpecificClass2的规则产生任何影响。

现在我退后一步,发现只使用这一行是有问题的:

options.LoadWith<DerivedEntity2>(p => p.Bar);

由于Bar具有Type Inheritance规则,因此L2S处理它非常糟糕。我描述了查询,我遇到的问题似乎与此处描述的完全相同(无用的OUTER JOIN):http://connect.microsoft.com/VisualStudio/feedback/details/361683/using-dataloadoptions-with-a-linq-to-sql-inheritance-hierarchy-results-in-multiple-sql-left-joins。遗憾的是,无法应用变通方法,因为使用此方法我无法根据基本类型指定不同的包含规则。

仅仅用于加载单个继承的一对一关系的单个继承实体需要10秒并生成惊人数量的连接。当进一步推送LoadWith规则并一次加载多个实体时,我希望它需要一些时间并完成一个极端查询,但更糟糕的是:整个操作系统开始偶尔冻结。我以前从未经历过这种行为(通常你可以杀死这个过程),并且它在另一台PC上执行完全相同的操作并且两者都非常强大,所以这里显然是错误的。

现在,我的问题是:

  • 我正在尝试做的事情是合乎逻辑的还是我的数据架构设计在某种程度上被打破了?
  • 有什么方法可以获得我使用不同方法的目的吗?
  • 切换到实体框架会以任何方式帮助我解决这种情况吗? (从我读过的,不是真的)。​​

0 个答案:

没有答案