无法更新 EntitySet“SoreInfo_Table”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操(转)
2017-04-29 15:06
393 查看
摘自:http://www.cnblogs.com/jimcsharp/p/5912057.html
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/ffc3f77153aa6209e0723f657693d6e0.png)
其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活.
codefist是一个class代码文件,它可以由一些第三方的软件可视化的创建,也是非常灵活的一种方式,目前被使用也是最广泛的.
2, edmx文件的本质就是一个XML文件,它用于定义概念模型、存储模型和这些模型之间的映射。虽然edmx文件默认情况下以实体设计器的方式打开,还可以右击Model.edmx文件以XML文本编辑器打开,这时就可以看到edmx文件的庐山真面目:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/3fd8e3e5e8e99c7d67dd9a746e597db0.png)
从代码中可以看到,edmx大致由SSDL、CSDL、C-S三部分组成,分别对应着对于数据库、实体、数据库表与实体之间的映射这三方面的解析,SSDL中有对数据库表、字段等的规定,CSDL中有对实体名、实体属性等的规定,C-S中有对数据库表与实体之间的映射。一句话总结edmx文件,就是用来解析存储模型、概念模型以及这两者之间的映射,其实也还是上文中那张图片的详细表现。
3, 利用T4 分离 Entity 和 DbContext
将 EfModel.tt 文件拆分到 Entity 层,EfModel.Edmx、EfModel.Content.tt 保留在 DAL 层。
设置EfModel.edmx的Code Generation Strategy设为None[确保EFModel.edmx不自动产生代码]
参考:http://www.cnblogs.com/fangrobert/archive/2011/08/22/2150048.html
4,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/38cb681d06e36497e6738505fa291ad2.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/c3ac0707f96f975661bbcc9a2bc5b3c2.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/d88839ccd37fa231cff797263832dc64.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/50eee012319c85ebb1c16f8aa2bfd1e1.png)
我再加入一个有主键的表进行对比,同样的在SSDL中,可以看到有主键的表的定义如下。
我们把没有主键的<EntitySet>照着上面这个节点进行更改:删除<DefiningQuery>节点,将store:Schema=”dbo”更改为Schema=”dbo”。这样我们就可以对之前没有设置主键的表进行更新、删除以及插入操作了。
无主键的表SSDL定义其实更像是视图,我有一点不明的是store:这个命名空间的作用是什么,为什么只是删除<DefiningQuery>不行,还需要将Schema属性的store命名空间删除才可以。以上都是我还不明白的地方,只是作为一个解决方案,它确实简单可行。
5,
在不提供任何连接数据库信息的情况下,EF会创建一个默认的DefaultConnectionFactory,这个默认的连接工厂使用的就是SqlConnectionFactory,然后我们可以通过reflector看到它的构造函数如下。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/93bb9f3516aaac981265854a96e71878.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/a0c25f57268e5dbab2be973fbe0ec8a5.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/ee1d420c25f1177a242fa7ca855cc6de.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/6d29dd9a1d908d33f507eeb6f75f95f6.png)
不过不管怎样,我觉得还是指定好连接字符串来开发比较好,排除各种不可控的因素。
参考:http://www.cnblogs.com/heqichang/archive/2012/10/15/2723906.html
6,ef power tools去直接生成codefirst的模型,去掉 edmx 文件。
Entity Framework Power Tools Beta 4 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/2055761.html http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html
通过Model First的方式+ADO.NET DbContext Generator生成器 实现Code First方式业务(EDMX通过DbContext构造注入其中),到达Hibernate的效果。EDMX相当于Hibernate
对象模型XML映射文件,POCO相当于Hibernate对象模型(virtual实现关联导航加载),DbContext通过泛型构建IRepository数据操作类。
来自为知笔记(Wiz)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/ffc3f77153aa6209e0723f657693d6e0.png)
其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活.
codefist是一个class代码文件,它可以由一些第三方的软件可视化的创建,也是非常灵活的一种方式,目前被使用也是最广泛的.
2, edmx文件的本质就是一个XML文件,它用于定义概念模型、存储模型和这些模型之间的映射。虽然edmx文件默认情况下以实体设计器的方式打开,还可以右击Model.edmx文件以XML文本编辑器打开,这时就可以看到edmx文件的庐山真面目:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/3fd8e3e5e8e99c7d67dd9a746e597db0.png)
从代码中可以看到,edmx大致由SSDL、CSDL、C-S三部分组成,分别对应着对于数据库、实体、数据库表与实体之间的映射这三方面的解析,SSDL中有对数据库表、字段等的规定,CSDL中有对实体名、实体属性等的规定,C-S中有对数据库表与实体之间的映射。一句话总结edmx文件,就是用来解析存储模型、概念模型以及这两者之间的映射,其实也还是上文中那张图片的详细表现。
3, 利用T4 分离 Entity 和 DbContext
将 EfModel.tt 文件拆分到 Entity 层,EfModel.Edmx、EfModel.Content.tt 保留在 DAL 层。
设置EfModel.edmx的Code Generation Strategy设为None[确保EFModel.edmx不自动产生代码]
参考:http://www.cnblogs.com/fangrobert/archive/2011/08/22/2150048.html
4,
更新没有设置主键的表
在默认情况下,EF不能对一个没有主键的表进行更新、插入和删除的动作。用xml方式查看edmx文件,可以在SSDL中可以看到如下xml片断(我定义了一个没有主键的表tb_WithoutKey)。![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/38cb681d06e36497e6738505fa291ad2.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/c3ac0707f96f975661bbcc9a2bc5b3c2.png)
<EntitySet Name="tb_WithoutKey" EntityType="TransferModel.Store.tb_WithoutKey" store:Type="Tables" store:Schema="dbo" store:Name="tb_WithoutKey"> <DefiningQuery> SELECT [tb_WithoutKey].[ID] AS [ID], [tb_WithoutKey].[Name] AS [Name] FROM [dbo].[tb_WithoutKey] AS [tb_WithoutKey] </DefiningQuery> </EntitySet>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/d88839ccd37fa231cff797263832dc64.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/50eee012319c85ebb1c16f8aa2bfd1e1.png)
我再加入一个有主键的表进行对比,同样的在SSDL中,可以看到有主键的表的定义如下。
<EntitySet Name="tb_WithKey" EntityType="TransferModel.Store.tb_WithKey" store:Type="Tables" Schema="dbo" />
我们把没有主键的<EntitySet>照着上面这个节点进行更改:删除<DefiningQuery>节点,将store:Schema=”dbo”更改为Schema=”dbo”。这样我们就可以对之前没有设置主键的表进行更新、删除以及插入操作了。
无主键的表SSDL定义其实更像是视图,我有一点不明的是store:这个命名空间的作用是什么,为什么只是删除<DefiningQuery>不行,还需要将Schema属性的store命名空间删除才可以。以上都是我还不明白的地方,只是作为一个解决方案,它确实简单可行。
5,
更改Code-First的默认连接
我们知道使用Code-First的时候我们甚至可以不用写连接字符串,但是这个默认的连接只识别本机的SQL Express版数据库,如果你是使用其它数据库甚至就是Sql Server非Express版,都不行。在不提供任何连接数据库信息的情况下,EF会创建一个默认的DefaultConnectionFactory,这个默认的连接工厂使用的就是SqlConnectionFactory,然后我们可以通过reflector看到它的构造函数如下。
public SqlConnectionFactory() { this._baseConnectionString = @"Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True"; }所以说EF默认只能连Sql Express版的数据库。SqlConnectionFactory提供一个构造函数重载,可以指定连接字符串,修改默认的数据库连接,我们可以在配置文件中添加以下节点进行配置。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/93bb9f3516aaac981265854a96e71878.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/a0c25f57268e5dbab2be973fbe0ec8a5.png)
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> <parameters> <parameter value="Data Source=heqichang-pc; Integrated Security=True; MultipleActiveResultSets=True" /> </parameters> </defaultConnectionFactory> </entityFramework>
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/ee1d420c25f1177a242fa7ca855cc6de.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/13/6d29dd9a1d908d33f507eeb6f75f95f6.png)
不过不管怎样,我觉得还是指定好连接字符串来开发比较好,排除各种不可控的因素。
参考:http://www.cnblogs.com/heqichang/archive/2012/10/15/2723906.html
6,ef power tools去直接生成codefirst的模型,去掉 edmx 文件。
Entity Framework Power Tools Beta 4 https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/2055761.html http://www.cnblogs.com/LingzhiSun/archive/2011/04/13/EF41_WokingWithProperties.html
Entity Framework 常见的问题解决
7,通过Model First的方式+ADO.NET DbContext Generator生成器 实现Code First方式业务(EDMX通过DbContext构造注入其中),到达Hibernate的效果。EDMX相当于Hibernate
对象模型XML映射文件,POCO相当于Hibernate对象模型(virtual实现关联导航加载),DbContext通过泛型构建IRepository数据操作类。
来自为知笔记(Wiz)
相关文章推荐
- 无法更新 EntitySet“XXX”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的
- 无法更新 EntitySet“W_ReceiveData”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
- 无法更新 EntitySet,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的..元素
- 无法更新 EntitySet“Ips_Articles”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
- 无法更新EntitySet“ForestryFacilities_table”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持
- 无法更新 EntitySet“”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素
- “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而<ModificationFunctionMapping>元素中没有支持当前操作的<InsertFunction>元素”问题的解决方法
- 无法更新 EntitySet“GuigeInfo”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素。
- 模板,报错:法更新 EntitySet“T_Employee”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <U
- 因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素
- 因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有 支持当前操作的 <DeleteFunction> 元素
- 因为它有一个 DefiningQuery,而 <ModificationFunctionMapping> 元素中没有支持当前操作的 <InsertFunction> 元素
- “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
- EF框架:“无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
- “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
- “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
- .NET错误提示之:无法更新EntitySet“TableName”因为它有一个DefiningQuery
- 无法更新 EntitySet“Message”,因为它有一个 DefiningQuery
- 【工作记录0016】无法更新 EntitySet“表名”,因为它有一个 DefiningQuery
- it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element