在实体框架5中将代码生成从无变为默认后出现错误

J K*_*ing 5 .net entity-framework visual-studio entity-framework-5

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

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

错误67'公共属性"TableColumnName" As "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设计器.在属性窗口中,将代码生成策略更改为默认值而不是.
  5. 构建项目,将出现错误.

我在用:

  • visual studio 2012 pro v.11.0.51106.01 update 1
  • .NET 4.5.50709
  • Windows 8专业版

我将安装sql server 2012 express,看看这是否有所不同

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

谢谢

小智 7

请参阅以下链接.我花了很多时间对这个问题感到沮丧,并且发现这个支持文章来自"添加域服务类"屏幕后面的'一些......可能会丢失'...

观察摘要是WCF RIA不支持DBContext(由.tt文件表示).要使用Domain服务类,需要ObjectContext类.以下是支持文章的解决方案.

为了将您的Entity Framework模型与WCF RIA Services一起使用,您必须将其转换为基于"ObjectContext"的模型.这可以使用以下步骤完成:

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

执行这些步骤后,您将能够在"可用上下文类"列表中选择实体模型的上下文类.此过程的副作用是您现在已将实体模型从基于Entity Framework DbContext的模型转换为基于ObjectContext的模型.


小智 5

将代码生成策略设置为"无"是正确的,您应该这样做.

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

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