EF中的POCO类未按预期工作

问题描述 投票:6回答:5

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

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

Question 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; }

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

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

Question 2

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

visual-studio-2012 entity-framework-5 poco edmx
5个回答
34
投票

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

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

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

“从DB更新模型”过程将更新SSDL(更改与当前数据库模式不一致的所有内容),只有在您向数据库模式添加新内容时才会修改CSDL。

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

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

希望这可以帮助!

编辑:

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

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


4
投票

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


0
投票

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

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


0
投票

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

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.