沒法更新 EntitySet「SoreInfo_Table」,由於它有一個 DefiningQuery,而 元素中沒有支持當前操(轉)

摘自: http://www.cnblogs.com/jimcsharp/p/5912057.html

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數據操做類。



相關文章
相關標籤/搜索