5

我有一个 wpf 项目 4.5,我正在使用 EF 5 生成模型类。我想为生成的 EF 类实现 iNotifyPropertyChanged。所以我右键单击我的设计器(visual studio 2012)并将代码生成设置从“无”更改为“默认”

一旦我这样做了,我就会遇到数百个错误,如下所示:

错误 67 '公共属性"TableColumnName"因为"ColumnType"有多个具有相同签名的定义。

[编辑 1]

这些错误都在 DataModel.Designer.Vb 文件中引发。它们出现在与另一个表中的列/导航属性同名的任何表列属性或导航属性上。我很难相信我不能在不同的表中拥有相同名称的列,这里肯定发生了其他事情。

[编辑 2]

所以我从设计器中删除了我所有的数据库对象,然后将代码生成策略更改为默认策略,然后在图表中添加了一个表(客户端)。对于表的每个属性,我都会遇到很多错误(所以这一定不是因为其他表具有与我之前认为的相同的列名)。我在每个属性(表列)上都收到上面列出的错误,以及每个属性的以下错误:

错误变量“_ColumnName”与为“client”类中的属性“ColumnName”隐式声明的成员冲突。C:...\FTC_DAL.Designer.vb

当我将代码生成恢复为无时,这种情况就消失了。我开始认为这是 EF 5 中的一个错误。

[编辑 3]

重现步骤:

  1. 在 Visual Studio 2012、wpf 应用程序中创建新项目。
    它可以是vb或c,我都测试过
  2. 添加 ADO.NET 实体数据模型(edmx 文件)
  3. 从 sql server 添加表(我使用的是 express 2008 R2)
  4. 构建项目,然后在空白处单击 edmx 设计器。在属性窗口中,将代码生成策略更改为default而不是none
  5. 构建项目,将出现错误。

我在用:

  • 视觉工作室 2012 专业版 v.11.0.51106.01 更新 1
  • .NET 4.5.50709
  • 视窗 8 专业版

我将安装 sql server 2012 express 看看这是否有什么不同

有人可以帮我弄清楚为什么会发生这些错误。

谢谢

4

2 回答 2

7

请参考以下链接。我花了很多时间对这个问题感到沮丧,并从显示在“添加域服务类”屏幕上的链接中找到了这篇支持文章,就在“一些......可能丢失”之后......

观察总结是 WCF RIA 不支持 DBContext(由 .tt 文件指示)。要使用域服务类,需要 ObjectContext 类。这是支持文章中的解决方案。

为了将实体框架模型与 WCF RIA 服务一起使用,您必须将其转换为基于“ObjectContext”的模型。这可以使用以下步骤来完成:

  1. 在设计器中打开您的实体模型
  2. (如果需要,点击设计器的“空白”,确保模型内没有对象被选中)
  3. 在“属性”窗口中,将“代码生成策略”从“无”更改为“默认”
  4. 删除与模型相邻的两个“.tt”文件,假设您在创建实体模型时没有将这些文件修改为超出其原始状态。如果您修改了这些文件,则对实体模型的自定义将丢失。
  5. 重建项目

完成这些步骤后,您将能够在“可用上下文类”列表中选择实体模型的上下文类。此过程的副作用是您现在已将实体模型从基于实体框架 DbContext 的模型转换为基于 ObjectContext 的模型。

于 2013-09-20T21:02:03.233 回答
5

将代码生成策略设置为“无”是正确的,您应该这样保留它。

当您将其更改为“默认”时,您将获得模型中所有实体的类。但是,您已经从.tt模板中获得了这些相同的类。结果,您将获得所有班级成员两次。

为了改变类的生成方式,仍然将代码生成策略保留为“无”,因为默认代码生成无论如何都不能自定义。该Model.tt文件可以自由修改以满足您的需要,并且不应该花费太多精力来修改它以使您的类实现您想要的任何接口。

于 2013-02-14T18:00:04.043 回答