2012-07-02 45 views
1

一直存在的关于这一主题(Modifying an Entity Framework Model at Run-Time)讨论相当位,但到目前为止,我还没有能够找到一个很好的解决问题的办法。我们目前有一个使用EF 4.0构建的模型,并且需要允许客户将自定义字段添加到各个表中。目前我们已经用一些描述新属性的通用表格解决了这个问题,但是我们发现解决方案表现不佳。修改在运行时的ORM模型

有谁知道的动态列添加到数据库,并更新ORM,以反映在运行时的好办法?

+0

我想这线程回答你的问题 的http://计算器。com/questions/4019895 /修改实体框架模型在运行时 –

回答

2

在运行时更新EF以反映数据库中的更改没有好的,好的或可管理的方法。如果你真的有一个必须在运行时更改的数据库,EF对你来说不是好工具。 EF是强类型的 - 对数据库的每次更改都必须不仅反映在映射中,而且还反映在用于加载和保持数据的实体类中。

在运行时更改实体类总是会在运行时发送IL代码的区域。如果您通过创建具有动态模块和动态实体类型的动态装配过程,您将面临许多新挑战:

  • 您不会更改现有类型 - 每次用户添加时都会生成一个新类型或删除一些财产。
  • 新类型为重建上下文的元数据工作空间带来了新的性能成本。如果您在服务器上使用它,则还必须确保它已正确同步。另一个问题是旧类型的所有现有实例(在添加或删除属性之前)现在对于EF上下文的新实例是未知的并且不能被持久化。如果你想持久保存它们,你也需要具有旧元数据工作空间的EF上下文实例。
  • 很多代码可能会使用dynamic而不是实际类型=无编译时检查。当直接与EF进行交互时,继承和接口将不会有用,因为必须映射继承(您不需要它),并且接口不被EF接受。
  • 新的类型在设计时是未知的 - 你不能用它来设计时间码和编译。
  • EF不喜欢dynamicExpandoObject,因为它使用反射映射 - >在运行时动态实例必须是正确的类型,否则反射将无法正常工作。
  • 如何为动态类型编写查询?查询通常始于为具体类型创建的DbSetObjectSet的通用实例 - 您必须能够动态地创建这些实例。泛型参数必须是映射到当前上下文的类型 - dynamic在这种情况下不起作用,因为它不是映射类型。
  • 对于这种情况,.NET有很好的行为。它不能卸载组件。因此,每当您生成一个新类型时,您也会加载旧时间。

您还是要在运行时改变EF?你目前的做法是正确的。简单地调整它以获得更好的性能,但要注意这些要求始终伴随着性能成本 - 尤其是EF。

替代地使用与链接表中提到的最后一种方法 - 预定义的自定义字段的固定数量的直接在主实体。

+0

感谢您的回答,我们将做一些分析,并看看是否有任何可加快的领域。我怀疑我们调用SaveChanges的次数可能太高。 –