在代码中,是否有办法在添加新项目时创建对象上下文时执行的操作 - >视觉工作室中的实体数据模型?
让我们说比如说我在我的数据库中添加了一个新表。下次我加载使用该数据库模型的应用程序时,它会刷新模型并自动为该新表创建默认概念映射。
我可能会使用ESQL来查询数据库而不是LINQ-To-Entities,因此我不关心是否存在对新实体集/对象的强类型访问。
此外,此解决方案首先需要 EF代码吗?
答案 0 :(得分:2)
我的观点是EF和EDMX还没有为这种情况做好准备。让我澄清一下原因:
ObjectContext
只能使用这些文件中提供的实体。 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文件中,您可以在运行时加载它们:
你必须将实体映射到类,这就是它变得丑陋的地方。可以在运行时使用reflection-api生成类。或者只是选择具有许多属性的泛型类,如StringProperty1,StringProperty2。
为了您的目的,SQL比ESQL更合适。