【问题标题】:POCO Class in EF not working as ExpectedEF 中的 POCO 类未按预期工作
【发布时间】:2013-03-10 20:11:40
【问题描述】:

我在 SQL 中创建了一个数据库,并在 Visual Studio 2012 中创建了一个 EDMX。它自动创建了 POCO (TT) 类。一切看起来都很好。

现在我更改表的列名。我更新了 EDMX。在 XML 中打开 EDMX,一切看起来都很好。

问题 1

在 TT 中运行自定义工具后,我看到另外创建了一个新属性,例如:

SQL table name : Student

Column name : sName

在我的 POCO 课上

public int sName{ get; set; }

自动创建。

现在我将 SQL 中的列名更改为

Column name : studentName

我的 POCO 课

public int sName{ get; set; }

public int studentName{ get; set; }

这是一个错误还是我需要做些什么来解决这个问题?

我应该怎么做才能避免这种情况?

问题 2

此外,如果我更改任何 SQL 列的数据类型并从我的 EDMX 设计器中的数据库更新模型,则不会更新概念模型。我该怎么办?

【问题讨论】:

    标签: visual-studio-2012 entity-framework-5 poco edmx


    【解决方案1】:

    首先,要了解您的问题,您需要知道EDMX 文件只是一个包含 3 个不同部分的 XML 文件:

    • CSDL:概念架构定义语言
    • SSDL:存储架构定义语言
    • MSL:映射规范语言

    CSDL 包含构成概念模型的实体和关系。 SSDL 描述您的数据库模型,MSL 是两者之间的映射。

    “从数据库更新模型”过程将更新 SSDL(更改与当前数据库架构不一致的所有内容),它只会在您向数据库架构添加新内容的情况下修改 CSDL。

    这是一种非常正常的行为,因为您的概念架构可能/应该与您的数据库架构不同(除非您希望您的域模型看起来与数据库模型完全一样,而这显然不是 OOP/DDD 最佳实践)。

    对于@Peru,解决方案是删除相关实体(不是整个 EDMX!),然后执行“从数据库更新模型”过程。

    希望这会有所帮助!

    编辑:

    有一个工具,不是免费的,它是一个 Visual Studio 插件,允许您将更改应用到数据库中,包括 CSDL 和 SSDL 文件:Huagati DBML/EDMX Tools。 唯一的“免费”解决方案是删除需要更新的实体(或该实体中的正确字段)。

    请记住,CSDL 应该由开发人员维护,并且必须看起来像对象模型而不是数据库模型。假设您在实体之间设置了继承,或者您已将 1 个 DB 表拆分为 2 个 EDMX 实体,运行“从 DB 更新模型”不应覆盖所有内容!

    【讨论】:

    • 删除实体是唯一的解决方案?
    • 有一个现有的 VS 插件可以完成这项工作。我已经编辑了我的答案。
    • @MaxS-Betclic:当你说csdl must look lie an object model rather than a DB model时,你能给我们举个例子吗
    • 好吧,您的数据库模型应该与您的业务模型不同。数据库引擎将不得不处理其他问题,这些问题将导致您组织数据的存储方式与您设计域的方式不同。领域模型是关于业务的,而数据库模型是关于存储的。
    • @AbuHamzah 看看this UncleBob article 和这个EF training 走得更远
    【解决方案2】:

    就我个人而言,我会以 XML 格式打开 edmx 文件并找到问题节点并将其删除。该文件很容易理解 - 不要害怕至少尝试一下。

    【讨论】:

      【解决方案3】:

      我知道我来晚了,但是 有一种相对简单的方法可以从 EDMX 设计器生成 POCO/更新 DbContext。

      转到您的设计器,右键单击空白区域,单击“从数据库更新模型”,添加/更新您的表。这将更新您的 edmx XML。在您确认您的表已添加到 CSDL、SSDL 和 MSL 部分后,右键单击解决方案资源管理器中的 T4 模板(<Name>.tt,而不是 <Name>.Context.tt),然后单击“运行自定义工具” - 这将为任何更新的对象生成 POCO。请注意,如果您正在创建新实体,它们不会被添加到您的 DbContext 类中,您仍然需要通过在类底部添加以下行来手动执行此操作:public virtual DbSet<Entity_Name_Goes_Here> EntityNames { get; set; }

      【讨论】:

      • 我的 edmx 正在使用“从数据库更新模型”进行更新,但是实体类文件没有被创建/更新。在 .tt 文件上运行自定义工具创建了我缺少的实体类文件,谢谢:)。
      【解决方案4】:

      只有手动编辑适用于我项目中的视图。 (从 smallint 到 decimal(18,2) )

      在文本编辑器中打开 .EDMX 文件,找到合适的部分,然后手动更改 Property Type="..." 值。

      【讨论】:

        【解决方案5】:

        更新 Db 中的字段后,找到相应的 model.cs 文件,然后从模型中删除这些字段。现在更新 EDMX 文件(从数据库更新模型)。它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 2019-02-18
          • 1970-01-01
          • 2019-08-26
          • 2018-05-03
          • 1970-01-01
          相关资源
          最近更新 更多