关于EF(.edmx文件)中添加无主键视图失败解决方法

本文讨论了在使用Visual Studio 2010的Entity Framework时,遇到将SQL Server 2008视图添加到实体模型中失败的情况,并提供了通过选取最大ID作为主键的解决方案。

     最近在jquery ui中添加一个报表功能,数据库是sql,用的EF文件进行实体映射。报表数据已通过视图显示出来了,视图T_sql语句如下

SELECT  School_OID, Mon, SUM(CASE IsFinish WHEN 4 THEN 1 ELSE 0 END) AS FinishTask, COUNT(*) AS SumTask
FROM         dbo.V_TaskList_Maintain
WHERE  TaskTypeID <> 1
GROUP BY Mon, School_OID

用于统计每个地区,每个月的合格率。

虽然在sql2008中创建视图成功,但是在VS2010的EF中进行视图添加总是失败,报错如下


通过取最大id来做主键EF还是无法添加成功,最后使用以下语句解决此问题

SELECT   ISNULL(MAX(TaskID),1) ID....

<think>我们遇到的问题是:在添加现有项时选择了OilFieldPlatform.edmx,但只出现了OilFieldPlatform.edmx.diagram和OilFieldPlatform.Designer.cs,而其他文件(如OilFieldPlatform.cs,OilFieldPlatform.Context.tt,OilFieldPlatform.Context.cs,OilFieldPlatform.tt)没有出现。原因分析:在VisualStudio中,.edmx文件是一个实体数据模型文件,它通常包含多个子文件(在解决方案资源管理器中展开.edmx节点可以看到)。这些子文件包括:-.diagram:用于存储模型的可视化布局。-.Designer.cs:包含由EDM设计器生成的代码(如DbContext和实体类,在较新版本中,这部分代码通常由T4模板生成)。-.Context.tt和.tt:T4文本模板,用于生成DbContext和实体类(在较新版本中,EF使用T4模板来生成代码,而不是Designer.cs)。-.Context.cs:由.Context.tt模板生成的DbContext代码。-.cs:由.tt模板生成的实体类代码。当我们通过“添加现有项”添加.edmx文件时,VisualStudio会自动识别并添加.edmx关联的文件。但是,有时这些关联文件可能不会自动包含在项目中,尤其是当它们不在项目目录中或者项目文件.csproj)没有正确引用它们时。解决方案:1.确保所有备份文件都在项目目录下的同一文件夹中。2.手动添加缺失的文件到项目中。步骤:1.解决方案资源管理器中,右键单击项目->添加->现有项。2.浏览到备份文件所在的目录,选择所有缺失的文件(OilFieldPlatform.Context.tt,OilFieldPlatform.tt,OilFieldPlatform.Context.cs,OilFieldPlatform.cs等),然后点击添加。3.添加后,确保这些文件解决方案资源管理器中正确嵌套在.edmx文件下。如果它们没有自动嵌套,可以手动调整。但是,有时即使添加了这些文件,它们可能不会自动嵌套在.edmx文件下。这时我们可以手动编辑项目文件.csproj)来设置嵌套关系。手动编辑项目文件步骤:1.右键单击项目,选择“卸载项目”。2.再次右键单击项目,选择“编辑项目文件”。3..csproj文件中,找到与这些文件相关的条目,并添加嵌套关系。例如,对于OilFieldPlatform.Context.tt文件,它应该嵌套在OilFieldPlatform.edmx下。我们可以这样设置:原条目可能是:```xml<CompileInclude="OilFieldPlatform.Context.cs"/><NoneInclude="OilFieldPlatform.Context.tt"/><NoneInclude="OilFieldPlatform.edmx"/><NoneInclude="OilFieldPlatform.tt"/>```我们需要修改为:```xml<NoneInclude="OilFieldPlatform.edmx"><Generator>EntityModelCodeGenerator</Generator><LastGenOutput>OilFieldPlatform.Designer.cs</LastGenOutput></None><NoneInclude="OilFieldPlatform.Context.tt"><Generator>TextTemplatingFileGenerator</Generator><DependentUpon>OilFieldPlatform.edmx</DependentUpon><LastGenOutput>OilFieldPlatform.Context.cs</LastGenOutput></None><CompileInclude="OilFieldPlatform.Context.cs"><AutoGen>True</AutoGen><DesignTime>True</DesignTime><DependentUpon>OilFieldPlatform.Context.tt</DependentUpon></Compile><NoneInclude="OilFieldPlatform.tt"><Generator>TextTemplatingFileGenerator</Generator><DependentUpon>OilFieldPlatform.edmx</DependentUpon><LastGenOutput>OilFieldPlatform.cs</LastGenOutput></None><CompileInclude="OilFieldPlatform.cs"><AutoGen>True</AutoGen><DesignTime>True</DesignTime><DependentUpon>OilFieldPlatform.tt</DependentUpon></Compile>```注意:上面的代码只是一个示例,具体文件名需要根据实际情况调整。另外,如果项目已经使用了新的SDK风格(如.NETCore项目),则可能需要不同的处理方式。4.保存并关闭项目文件,然后重新加载项目。另一种方法是使用VisualStudio的“运行自定义工具”来重新生成代码:1.解决方案资源管理器中,右键单击.edmx文件,选择“运行自定义工具”。这应该重新生成Designer.cs文件(如果使用的是Designer.cs方式)。2.对于T4模板(.tt文件),右键单击.tt文件,选择“运行自定义工具”来生成对应的.cs文件。但是,如果这些文件缺失,首先需要将它们添加到项目中。如果问题仍然存在,可能需要检查:-文件是否在磁盘上存在,并且路径正确。-文件是否被设置为“嵌入资源”或其他不适当的生成操作(在属性窗口中检查生成操作,对于.tt文件应该是“无”,对于生成的.cs文件应该是“编译”)。由于我们无法直接提供代码,因为这是一个项目配置问题,但我们可以给出一个示例,展示如何手动编辑.csproj文件以设置嵌套关系。示例(.csproj文件片段):注意:以下示例适用于较旧的非SDK风格项目(如.NETFramework项目)。对于新的SDK风格项目(.NETCore),通常不需要手动设置,因为文件会自动嵌套。假设项目文件是旧的格式,我们可以这样设置:```xml<ItemGroup><NoneInclude="OilFieldPlatform.edmx"><Generator>EntityModelCodeGenerator</Generator><LastGenOutput>OilFieldPlatform.Designer.cs</LastGenOutput></None><NoneInclude="OilFieldPlatform.Context.tt"><Generator>TextTemplatingFileGenerator</Generator><DependentUpon>OilFieldPlatform.edmx</DependentUpon><LastGenOutput>OilFieldPlatform.Context.cs</LastGenOutput></None><CompileInclude="OilFieldPlatform.Context.cs"><AutoGen>True</AutoGen><DesignTime>True</DesignTime><DependentUpon>OilFieldPlatform.Context.tt</DependentUpon></Compile><NoneInclude="OilFieldPlatform.tt"><Generator>TextTemplatingFileGenerator</Generator><DependentUpon>OilFieldPlatform.edmx</DependentUpon><LastGenOutput>OilFieldPlatform.cs</LastGenOutput></None><CompileInclude="OilFieldPlatform.cs"><AutoGen>True</AutoGen><DesignTime>True</DesignTime><DependentUpon>OilFieldPlatform.tt</DependentUpon></Compile><NoneInclude="OilFieldPlatform.edmx.diagram"/><CompileInclude="OilFieldPlatform.Designer.cs"><AutoGen>True</AutoGen><DesignTime>True</DesignTime><DependentUpon>OilFieldPlatform.edmx</DependentUpon></Compile></ItemGroup>```这样设置后,文件应该会在.edmx文件下嵌套显示。如果问题复杂,可能需要重新生成整个EDM模型。最后,请确保在添加这些文件后,重新生成项目(右键单击项目->重新生成),以确保没有编译错误。由于这是一个比较具体的项目配置问题,没有通用的代码可以写,但上述步骤应该能帮助解决。§§相关问题§§:1.如何解决VisualStudio中T4模板不生成代码的问题?2.在EntityFramework中,edmx文件与DbContext和实体类的关系是什么?3.如何手动编辑.csproj文件来管理文件嵌套?4..NETCore项目中,如何添加和使用EntityFramework的edmx模型?</think>### 解决方案:恢复缺失的 EDMX 关联文件 当通过 **"添加现有项"** 仅导入 `.edmx` 文件时,关联的 T4 模板文件(`.tt`)和生成的代码文件(`.cs`)可能不会自动包含在项目中。以下是完整的解决步骤: --- #### **步骤 1:手动添加缺失文件** 在解决方案资源管理器中,**手动添加所有备份文件**: 1. 右键单击项目 → **添加 → 现有项** 2. 全选所有备份文件(包括 `.tt` 和 `.cs` 文件) 3. 点击 **添加** ```plaintext OilFieldPlatform.edmx OilFieldPlatform.edmx.diagram OilFieldPlatform.Designer.cs OilFieldPlatform.Context.tt // 手动添加 OilFieldPlatform.Context.cs // 手动添加 OilFieldPlatform.tt // 手动添加 OilFieldPlatform.cs // 手动添加 ``` --- #### **步骤 2:修复文件嵌套关系** 添加后,文件可能未正确嵌套在 `.edmx` 下。**手动设置嵌套关系**: 1.解决方案资源管理器中,将文件拖拽到 `.edmx` 下 - 或编辑 `.csproj` 文件(右键项目 → **编辑项目文件**) 2. 确保 `.csproj` 包含如下依赖关系: ```xml <!-- 示例:.csproj 中的正确配置 --> <ItemGroup> <EntityDeploy Include="OilFieldPlatform.edmx"> <Generator>EntityModelCodeGenerator</Generator> <LastGenOutput>OilFieldPlatform.Designer.cs</LastGenOutput> </EntityDeploy> <!-- T4 模板依赖 .edmx --> <None Include="OilFieldPlatform.Context.tt"> <Generator>TextTemplatingFileGenerator</Generator> <DependentUpon>OilFieldPlatform.edmx</DependentUpon> <LastGenOutput>OilFieldPlatform.Context.cs</LastGenOutput> </None> <!-- 生成的代码依赖 T4 模板 --> <Compile Include="OilFieldPlatform.Context.cs"> <AutoGen>True</AutoGen> <DesignTime>True</DesignTime> <DependentUpon>OilFieldPlatform.Context.tt</DependentUpon> </Compile> </ItemGroup> ``` --- #### **步骤 3:重新生成代码** 如果文件仍未生成: 1. 右键单击 `.tt` 文件 → **运行自定义工具** - `OilFieldPlatform.Context.tt` → 重新生成 `OilFieldPlatform.Context.cs` - `OilFieldPlatform.tt` → 重新生成 `OilFieldPlatform.cs` 2. 右键单击 `.edmx` 文件 → **运行自定义工具** - 重新生成 `OilFieldPlatform.Designer.cs` --- #### **关键点解释** - **T4 模板(`.tt` 文件)**:用于动态生成实体类(`.cs`)的代码模板,需明确依赖关系。 - **依赖关系**:在 `.csproj` 中通过 `<DependentUpon>` 确保文件嵌套显示。 - **自定义工具**:`.tt` 文件需要激活生成器(如 `TextTemplatingFileGenerator`)才能输出代码。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值