EF中的POCO类未按预期工作

时间:2013-03-21 10:53:17

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

我在SQL中创建了一个DataBase,并在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设计器中的DB更新模型,则不会更新概念模型。我该怎么做?

5 个答案:

答案 0 :(得分:33)

首先,要了解您的问题,您需要知道的是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更新模型”不应该覆盖所有内容!

答案 1 :(得分:4)

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

答案 2 :(得分:0)

只有手动编辑才能在我的项目中为View工作。 (从smallint到小数(18,2))

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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