6

我在 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 设计器中的数据库更新模型,则不会更新概念模型。我该怎么做?

4

5 回答 5

37

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

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

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

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

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

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

希望这可以帮助!

编辑:

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

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

于 2013-04-25T13:42:09.143 回答
5

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

于 2013-05-01T07:13:48.727 回答
4

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

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

于 2019-04-04T14:29:59.907 回答
1

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

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

于 2016-03-14T18:09:21.033 回答
-1

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

于 2018-12-11T01:43:24.777 回答