【问题标题】:Don't generate db but map to existing tables不生成数据库但映射到现有表
【发布时间】:2011-02-18 18:33:47
【问题描述】:

我们希望首先使用模型为我们的应用程序生成干净的 EF 模型,但我们不想让模型生成新的数据库架构,而是希望在实体内手动将表映射到现有数据库表或表。有这样的机制吗?

【问题讨论】:

    标签: .net entity-framework ef-code-first


    【解决方案1】:

    没错。

    这称为Entity Framework Code-First,这是good tutorial to help getting you started

    这个想法是您创建一些独立于您的 Repository/Database 类的 POCO 类。在这个 Repository/Database 类中,您定义了 POCO 之间的所有关系。幸运的是,Entity Framework 有许多约定可供您利用,这意味着您可能不需要定义每个关系和规则。

    例如。如果您的类称为User,那么它将假定(默认情况下,除非您覆盖它)数据库表称为Users,并且POCO 中的主键标识字段将是UserId,并且在数据库表。

    【讨论】:

      【解决方案2】:

      不确定我是否理解这个问题,但是当您使用向导创建新的实体数据模型时,第一步允许您“从数据库生成”,只需将其指向您现有的数据库。然后,您可以删除不需要的表和/或手动修改表映射。还可以选择首先在模型中显示哪些表格。

      【讨论】:

      • 在企业级应用程序中,当您有 750 个表和 500 个 proc 等时,您希望生成干净的模型而无需导入整个数据库。把它切开,甚至查看它都是非常有问题的。因此,用户所问的是企业级应用程序中真正有效的问题。您想要定义干净的模型,然后您可以将其附加到数据库中的适当表。据我所知,不幸的是,您不能先使用模型来执行此操作,但实际上我现在正在为大型企业级应用程序研究相同的问题。
      【解决方案3】:

      我还首先在 EF 4.0 中使用 EF 模型寻找此选项。我还想从一个小的干净模型开始,因为我们有一个巨大的企业级应用程序,我们无法将所有内容导入到一个 edmx 中,因为由于我们数据库的规模,它甚至不可见。

      因此,我们想首先考虑将模型作为构建更小、更清晰模型的选项,然后将它们映射到我们数据库中的现有表。

      这是我们学到的。

      模型首先生成将进入“现有数据库”的数据库模式。最初它有点误导,因为人们认为它创建了一个新的数据库。它实际上并没有创建数据库本身。 db 必须存在,然后模型首先生成将进入 db 的 t-sql 脚本。

      它会在您的项目中的新 .sql 文件中生成这些脚本,然后您可以查看该文件或将其发送给 dba(如果有的话)。

      假设您的表不存在,它将生成这些脚本作为表的 CREATES。

      因此,例如,如果您在模型中创建了一个“客户”实体,它将生成一个包含 CREATE TABLE T-sql 的脚本 (*.sql) 文件来为您的客户实体创建客户表,您可以然后在现有的 sql 数据库上运行。

      所以这就是它的设计目的,基本上为新模型生成干净的表。

      这是否意味着如果您的表已经存在,您根本无法使用它?不,你可以使用它。您只是不会运行它生成的创建脚本。我不相信它真的是为此而设计的,但我们对此进行了测试,它确实有效。

      您可能会在使用模型优先时遇到其他问题,我们发现的一个限制是,由于模型优先旨在生成新的数据库模式,因此您无法映射到现有的存储过程。这对我们来说是个问题,因此我们首先取消了模型作为我们架构的一个选项。

      我们现在正在审查代码优先和数据库优先作为企业级系统的选项,现在我们现在倾向于代码优先。代码优先允许您创建可以使用的小型、可管理的上下文,这在大型企业级应用程序中似乎非常有用。

      【讨论】:

        猜你喜欢
        • 2012-05-18
        • 2012-09-15
        • 1970-01-01
        • 2010-09-23
        • 2014-01-20
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多