Visual studio 2012 EF中的POCO类未按预期工作

Visual studio 2012 EF中的POCO类未按预期工作,visual-studio-2012,entity-framework-5,poco,edmx,Visual Studio 2012,Entity Framework 5,Poco,Edmx,我已经在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中

我已经在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; }
这是一个bug还是我需要做些什么来修复它

我应该做些什么来避免这种情况

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

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

  • 概念模式定义语言
  • SSDL:存储模式定义语言
  • 映射规范语言
CSDL包含构成概念模型的实体和关系。SSDL描述了您的DB模型,MSL是2之间的映射

“从DB更新模型”过程将更新SSDL(更改与当前DB模式不一致的所有内容),它仅在您向DB模式添加新内容的情况下修改CSDL

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

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

希望这有帮助

编辑:

有一个不是免费的工具,它是一个Visual Studio插件,允许您在CSDL和SSDL文件上应用对DB所做的更改:。 唯一的“自由”解决方案是删除需要更新的实体(或该实体中的右字段)


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

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

只有手动编辑对我的项目中的视图有效。(从smallint到十进制(18,2))


在文本编辑器中打开.EDMX文件,查找appropite部分,并手动更改属性类型=“…”值。

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

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


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

删除实体是唯一的解决方案?现有的VS插件可以完成此任务。我已经编辑了我的答案。@MaxS Betclic:当你说
csdl必须看起来是一个对象模型而不是数据库模型时,你能给我们举个例子吗。DB引擎必须处理其他问题,这些问题将导致您以不同于您设计域的方式组织数据的存储方式。域模型是关于业务的,而DB模型是关于存储的。@AbuHamzah看了一下,这个go-FutureMy edmx是通过使用“从数据库更新模型”来更新的,但是实体类文件没有被创建/更新。在.tt文件上运行自定义工具创建了我丢失的实体类文件,谢谢:)。