Entity Framework 杂碎

Windows-Live-Writer_75eacc89fb20_B51C_Development_approaches_diagram_8c9f576c-ca82-4843-9177-c9fc84ea9bbb

其实看图很简单,database first和model first都是经过 data model建立的edmx文件,只不过model first模块能够本身根据须要建立和修改实体,显得更加灵活.html

codefist是一个class代码文件,它能够由一些第三方的软件可视化的建立,也是很是灵活的一种方式,目前被使用也是最普遍的.数据库

2, edmx文件的本质就是一个XML文件,它用于定义概念模型、存储模型和这些模型之间的映射。虽然edmx文件默认状况下以实体设计器的方式打开,还能够右击Model.edmx文件以XML文本编辑器打开,这时就能够看到edmx文件的庐山真面目:app

         

        从代码中能够看到,edmx大体由SSDL、CSDL、C-S三部分组成,分别对应着对于数据库实体数据库表与实体之间的映射这三方面的解析,SSDL中有对数据库表、字段等的规定,CSDL中有对实体名、实体属性等的规定,C-S中有对数据库表与实体之间的映射。一句话总结edmx文件,就是用来解析存储模型、概念模型以及这二者之间的映射,其实也仍是上文中那张图片的详细表现。编辑器

3, 利用T4 分离 Entity 和 DbContext函数

将 EfModel.tt 文件拆分到 Entity 层,EfModel.Edmx、EfModel.Content.tt 保留在 DAL 层。post

设置EfModel.edmx的Code Generation Strategy设为None[确保EFModel.edmx不自动产生代码]this

参考:http://www.cnblogs.com/fangrobert/archive/2011/08/22/2150048.htmlurl

4,spa

更新没有设置主键的表

 

在默认状况下,EF不能对一个没有主键的表进行更新、插入和删除的动做。用xml方式查看edmx文件,能够在SSDL中能够看到以下xml片段(我定义了一个没有主键的表tb_WithoutKey)。.net

 

复制代码
<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>
复制代码

 

我再加入一个有主键的表进行对比,一样的在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提供一个构造函数重载,能够指定链接字符串,修改默认的数据库链接,咱们能够在配置文件中添加如下节点进行配置。

复制代码
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> <parameters> <parameter value="Data Source=heqichang-pc; Integrated Security=True; MultipleActiveResultSets=True" /> </parameters> </defaultConnectionFactory> </entityFramework>
复制代码

不过无论怎样,我以为仍是指定好链接字符串来开发比较好,排除各类不可控的因素。

参考: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数据操做类。

相关文章
相关标签/搜索