在代码或应用程序加载中刷新/重新创建EF对象上下文

时间:2011-06-17 18:22:16

标签: visual-studio entity-framework entity-framework-4 objectcontext

在代码中,是否有办法在添加新项目时创建对象上下文时执行的操作 - >视觉工作室中的实体数据模型?

让我们说比如说我在我的数据库中添加了一个新表。下次我加载使用该数据库模型的应用程序时,它会刷新模型并自动为该新表创建默认概念映射。

我可能会使用ESQL来查询数据库而不是LINQ-To-Entities,因此我不关心是否存在对新实体集/对象的强类型访问。

此外,此解决方案首先需要 EF代码吗?

3 个答案:

答案 0 :(得分:2)

我的观点是EF和EDMX还没有为这种情况做好准备。让我澄清一下原因:

  • EDMX只是设计师使用的文件。在运行时,您需要从EDMX文件生成3个XML文件(SSDL,MSL和CSDL)。这些文件定义了模型,它们是实体连接字符串的一部分。
  • ObjectContext只能使用这些文件中提供的实体。
  • 标准方法是每个连接/上下文单个这些文件集。一旦遵循标准方法,您就会非常困难,因为添加表意味着修改这些XML文件(您必须使用单独部署这些文件的方法 - 默认方法将这些文件用作数据访问程序集内的资源)。
  • 我描述了如何hack EF to allow multiple files per single connection,但我不推荐它。
  • 如果您创建单独的元数据文件集,则需要另一个上下文实例来处理新实体(另一个连接字符串),并且这两个上下文将不会彼此了解,并且将无法使用在其他实体中映射的实体。
  • 映射只是故事的一部分。现在你需要一个代表你的应用程序实体的类!如果你只想在开发中使用这种“动态”行为,那么你可以,但是在运行时或重新加载应用程序时将表添加到模型看起来不是一种方法 - 在ORM工具中定义模型是为了设计时而不是为了运行时=你需要与您的新实体编译组合,您需要一个代码,它将使用这些新实体并引用您的新程序集。

DefiningQuery只是数据库查询 - 您可以使用数据库中存在的任何表(甚至是其他数据库),因为EF只对此查询的结果集感兴趣。

首先使用代码,您将获得更好的开发体验。代码首先不需要EDMX文件 - 它使用代码定义的映射。您将需要您的应用程序从bootstrap中的预定义(或所有引用的)程序集中收集从EntityTypeConfiguration<>派生的所有类型。创建第一个上下文实例时,所有这些配置都将添加到DbModelBuilder OnModelCreation中。在重新启动应用程序并使用实体部署新程序集后,您将拥有一个可以轻松使用任何新实体的上下文。您仍需要使用此实体的代码。您必须手动创建DbSet,而不是通过调用context.Set<EntityType>()将它们作为上下文类的属性公开。首先使用代码执行此操作时会有一些问题,因为您必须关闭实体模型验证和数据库重新创建,并且必须保持所有内容同步。

我们仍在讨论部署新程序集的情况,并且在重新启动应用程序时,它将使用程序集。如果您需要从应用程序本身管理表和“实体”,那么它不是直接使用ORM的方案。这适用于某些元数据模型/多租户场景,并且完全不同于ORM用于某些通用抽象表,而真实实体是从存储为抽象的元数据构建的。

答案 1 :(得分:0)

为什么你真的想这样做?

我不知道如何做到这一点。创建实体模型时,实际上创建了一个基本上是xml的edmx文件。运行时无法修改这些定义文件。从这个edmx文件中,T4模板生成上下文和.NET类/实体。据我所知,您无法在运行时将类定义添加到模型/上下文中。

也许这篇文章也可以提供更多见解EF retrieve entities from undefined table/view。我们希望Ladislav Mrinka或Julie Lerman加入这个问题;)

首先关于EF代码。这没有任何区别,因为代码第一种方法也是edmx文件/实体模型,但随后从中生成数据库(而不是从数据库生成实体模型),最终结果是相同的,不会起作用不同的运行时间。

答案 2 :(得分:0)

嗯,.edmx文件仅适用于visual studio,不会成为应用程序的一部分。元数据存储在三个xml文件中,您可以在运行时加载它们:

http://blogs.msdn.com/b/alexj/archive/2010/01/27/tip-51-how-to-load-ef-metadata-from-an-arbitrary-stream.aspx

你必须将实体映射到类,这就是它变得丑陋的地方。可以在运行时使用reflection-api生成类。或者只是选择具有许多属性的泛型类,如StringProperty1,StringProperty2。

为了您的目的,SQL比ESQL更合适。

学习EF: http://www.testmaster.ch/EntityFramework.test