當前位置:首頁 » 存儲配置 » ef執行存儲過程

ef執行存儲過程

發布時間: 2023-05-09 20:36:26

1. 微軟EF框架存儲過程問題,VS2012+.NET4.5+EF6.1.1

我用的是5.0沒這個問題,不過如果你理解T4模板的話這個問題很好解決。

這個應該是6.0重構了一些命名空間後,和VS原有的實體數據模型模板不一致了。

解決辦法如下:修改你的 xx.Context.tt 文件:

if(container.FunctionImports.Any())
{
#>
usingSystem.Data.Objects;//改成usingSystem.Data.Entity.Core.Objects;
usingSystem.Data.Objects.DataClasses;
usingSystem.Linq;
<#
}

2. EF+Oracle中怎麼調用存儲過程

在EF圖上面右鍵,然後更新,選擇Func/SP,再保存,就可以使用該存儲過程了。

3. 在entity framework中怎麼調用存儲過程

一、使用存儲過程的必要性
我們知道EF通過元數據,即概念模型(Concept Model)、存儲模型(Storage Model)和概念/存儲映射(C/S Mapping),和狀態追蹤(State Tracking)機制可以為基於模型的操作自動生成SQL。對於一些簡單的項目開發,這是非常理想的,因為他們完全可以不用關注數據存儲層面的東西,你可以採用一些完全不具有資料庫知識的開發者。但是理想總歸是理想,對於企業級開發來說,我們需要的是對資料庫層面數據的操作有自己的控制。在這方面,我們可以隨便舉兩個典型的場景:
邏輯刪除:對於一些重要的數據,我們可能需要讓它們永久保存。當我們試圖「刪除」這些數據的時候,我們並不是將它們從數據表中移除(物理刪除),而是為這條記錄作一個已經被刪除的標記;
並發處理:為了解決相同的數據在獲取和提交這段時間內被另一個用戶修改或者刪除,我們往往SQL層面增加並發控制的邏輯。比較典型的做法是在每一個表中添加一個VersionNo這樣的欄位,你可以採用TimeStamp,也可以直接採用INT或者GUID。在執行Update或者Delete的SQL中判斷之前獲取的VersionNo是否和當前的一致。
讓解決這些問題,就不能使用EF為我們自動生成的SQL,只有通過使用我們自定義的存儲過程。
二、實現存儲過程自動匹配的必要條件
本篇文章提供的存儲過程自動映射機制是通過代碼生成的方式完成的。說白了,就是讀取原來的.edmx模型文件,通過分析在存儲模型中使用的數據表,導入基於該表的CUD存儲過程;然後再概念/存儲映射節點中添加實體和這些存儲過程的映射關系。那實現這樣的代碼生成,需要具有如下三個固定的映射規則。
數據表名-存儲過程名:這個映射關系幫助我們通過存儲模型中的實體名找到對應CUD三個存儲過程(如果實體是數據表);
數據表列名-存儲過程參數名:當存儲過程被執行的時候,通過這個映射讓概念模型實體某個屬性值作為對應的參數;
存儲過程參數名-版本:當進行參數賦值的時候,通過這個映射決定是使用Original或者Current版本。
在實際的開發過程中,這樣的標准存儲過程一般都是通過代碼生成器生成的(在我的文章《創建代碼生成器可以很簡單:如何通過T4模板生成代碼?[下篇]》中有過相應的實現),它們具有這樣的映射關系。
基於這三種映射關系,我定義了如下一個名為IProcereNameConverter的介面。其中OperationKind是我自定義的一個表示CUD操作類型的枚舉。
1: public interface IProcereNameConverter
2: {
3: string GetProcereName(string tableName, OperationKind operationKind);
4: string GetColumnName(string parameterName);
5: DataRowVersion GetVersion(string parameterName);
6: }
7:
8: public enum OperationKind
9: {
10: Insert,
11: Update,
12: Delete
13: }

按照我們當前項目採用的命名規范,我定義了如下一個默認的DefaultNameConverter。它體現的是這樣的映射關系,比如有個數據表明為T_USER(大寫,單詞之間用「_」隔開,並以T_為前綴),它對應的CUD存儲過程名分別為:P_USER_I、P_USER_U和P_USER_D(大寫,以代表存儲過程的P_為前綴,後綴_I/U/D表示CUD操作類型,中間為去除前綴的表名)。如果列名為USER_ID,參數名為p_user_id(小寫,加p_前綴)。如果需要用Original值為參數賦值,需要將p_前綴改成o_前綴(o_user_id)。
1: public class DefaultNameConverter: IProcereNameConverter
2: {
3: public string GetProcereName(string tableName, OperationKind operationKind)
4: {
5: switch (operationKind)
6: {
7: case OperationKind.Insert:
8: return string.Format("P_{0}_I", tableName.Substring(2));
9: case OperationKind.Update:
10: return string.Format("P_{0}_U", tableName.Substring(2));
11: default:
12: return string.Format("P_{0}_D", tableName.Substring(2));
13: }
14: }
15:
16: public string GetColumnName(string parameterName)
17: {
18: return parameterName.Substring(2).ToUpper();
19: }
20:
21: public DataRowVersion GetVersion(string parameterName)
22: {
23: if(parameterName.StartsWith("o"))
24: {
25: return DataRowVersion.Original;
26: }
27: else
28: {
29: return DataRowVersion.Current;
30: }
31: }
32: }

三、通過T4生成新的.edmx模型
我們採用的基於T4的代碼生成,了解EF的應該對T4不會感到陌生了。如果對代碼生成感興趣的話,可以看看我的文章《與VS集成的若干種代碼生成解決方案[博文匯總(共8篇)]》。這里利用藉助於T4 ToolBox這個開源工具箱,並採用SQL Server SMO獲取存儲過程信息。所有涉及到的文本轉化都實現在如下一個ProcereMappingTemplate類型中,由於內容較多,具體實現就忽略了,有興趣的朋友可能下載源代碼。ProcereMappingTemplate具有兩個構造函數的參數分別表示:源.edmx文件,伺服器和資料庫名,存儲過程的Schema(默認為dbo)和具體的ProcereNameConverter(默認為DefaultNameConverter)。
1: public class ProcereMappingTemplate: Template
2: {
3: public XmlDocument SourceModel { get; private set; }
4: public IProcereNameConverter ProcereNameConverter { get; private set; }
5: public Database Database { get; private set; }
6: public string Schema { get; private set; }
7:
8: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName);
9: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName,
10: IProcereNameConverter procereNameConverter, string schema);
11:
12: protected virtual XElement GenerateStorageModelNode();
13: protected virtual XElement GenerateMappingNode();
14: public override string TransformText()
15: {
16: XElement newStorageModelNode = this.GenerateStorageModelNode();
17: XElement newMappingNode = this.GenerateMappingNode();
18:
19: XmlNode storageModelNode = this.SourceModel.GetElementsByTagName("edmx:StorageModels")[0];
20: storageModelNode.InnerXml = newStorageModelNode.Elements().ToArray()[0].ToString();
21:
22: XmlNode mappingNode = this.SourceModel.GetElementsByTagName("edmx:Mappings")[0];
23: mappingNode.InnerXml = newMappingNode.Elements().ToArray()[0].ToString();
24:
25: this.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
26: this.Write(this.SourceModel.DocumentElement.OuterXml.Replace("xmlns=\"\"",""));
27: return GenerationEnvironment.ToString();
28: }
29: }

在使用過程中,你只需要在tt模板中創建這個ProcereMappingTemplate對象,調用Render方法即可。
1: <#@ template debug="true" hostSpecific="true" #>
2: <#@ output extension=".edmx" #>
3: <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
4: <#@ assembly name="Microsoft.SqlServer.Smo" #>
5: <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
6: <#@ assembly name="$(TargetDir)Artech.ProcereMapping.dll" #>
7: <#@ import namespace="Artech.ProcereMapping" #>
8: <#@ include file="T4Toolbox.tt" #>
9: <#
10: new ProcereMappingTemplate(this.Host.ResolvePath("UserModel.edmx"),".","EFExtensions").Render();
11: #>

四、看看生成出來的.emdx
通過上面創建的TT模板(你指定的資料庫中一定要存在具有相應映射關系的存儲過程),新的.edmx模型文件會作為該tt文件的依賴文件被生成出來。而這個新生成的.edmx具有存儲過程映射信息。具體來說,下面是原始的.edmx文件(只保留元數據節點)。
1: <?xml version="1.0" encoding="utf-8"?>
2: <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
3: <!-- EF Runtime content -->
4: <edmx:Runtime>
5: <!-- SSDL content -->
6: <edmx:StorageModels>
7: <Schema Namespace="Artech.UserModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
8: <EntityContainer Name="ArtechUserModelStoreContainer">
9: <EntitySet Name="T_USER" EntityType="Artech.UserModel.Store.T_USER" store:Type="Tables" Schema="dbo" />
10: </EntityContainer>
11: <EntityType Name="T_USER">
12: <Key>
13: <PropertyRef Name="USER_ID" />
14: </Key>
15: <Property Name="USER_ID" Type="varchar" Nullable="false" MaxLength="50" />
16: <Property Name="USER_NAME" Type="nvarchar" Nullable="false" MaxLength="50" />
17: </EntityType>
18: </Schema>
19: </edmx:StorageModels>
20: <!-- CSDL content -->
21: <edmx:ConceptualModels>
22: <Schema Namespace="Artech.UserModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
23: <EntityContainer Name="EFExtensionsEntities" annotation:LazyLoadingEnabled="true">
24: <EntitySet Name="Users" EntityType="Artech.UserModel.User" />
25: </EntityContainer>
26: <EntityType Name="User">
27: <Key>
28: <PropertyRef Name="ID" />
29: </Key>
30: <Property Name="ID" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" />
31: <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
32: </EntityType>
33: </Schema>
34: </edmx:ConceptualModels>
35: <!-- C-S mapping content -->
36: <edmx:Mappings>
37: <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
38: <EntityContainerMapping StorageEntityContainer="ArtechUserModelStoreContainer" CdmEntityContainer="EFExtensionsEntities">
39: <EntitySetMapping Name="Users">
40: <EntityTypeMapping TypeName="Artech.UserModel.User">
41: <MappingFragment StoreEntitySet="T_USER">
42: <ScalarProperty Name="ID" ColumnName="USER_ID" />
43: <ScalarProperty Name="Name" ColumnName="USER_NAME" />
44: </MappingFragment>
45: </EntityTypeMapping>
46: </EntitySetMapping>
47: </EntityContainerMapping>
48: </Mapping>
49: </edmx:Mappings>
50: </edmx:Runtime>
51: </edmx:Edmx>

這是新生成的.edmx文件中的XML。

4. 在ASP.NET MVC中如何使用EF調用存儲過程

要用EF調用存儲過程,必須將這個存儲過程拖拽到EF對應的文件中來,這樣這個存儲過程就自動變成了一個函數。例如存儲p_GetProct。那麼使用的時候
using(DataContext
oDataContext=new
DataContext())//EF對應的上下文對象
{
oDataContext.p_GetProct();//直接通過這樣調用就行了。當然,如果存儲過程有參數,也可以通過這個函數傳遞參數。
}
希望可以幫到你。

5. EF中怎麼調用SQL里剛建的存儲過程在線等

這個你需要到那個 Model1.edmx 設計畫橘帆面裡面,兆碼 重新載入一下 資料庫。

也就是圓猜雹 完成一個 由資料庫 生成 模型的處理。

也就是把資料庫裡面的那個 新建的存儲過程上面, 打一個勾, 就可以了。

保存好了以後, Model1.edmx 裡面, 應該就能看到你剛才加進去的存儲過程了。

6. EF 通過什麼方式 執行oracle的存儲過程

方法一:
exec procere_name;
execute procere_name;
方法二:裂氏局
call procere_name;
方肆讓法三:核銀
begin
execute procere_name;end;
end;

7. C#,EF中執行存儲過程返回一個ObjectResult對象,這個對象是延遲載入的嗎

ObjectResult,這個對象是延遲載入的,有機會可以到程序人生網站上交流。

8. MVC5加EF6 執行存儲過程 獲取表

zty_ABMXSFX 應該是你資料庫裡面對應的存儲過程

EF會把存儲過程映射為上下文中的一個方法, 起返回值為存儲過程中SELECT出來的值或結果集合

9. c# ef怎麼調用存儲過程

後台調用好、轉成前台需要的格式,傳遞給前端
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

熱點內容
數控內孔循環編程實例 發布:2025-02-09 11:51:41 瀏覽:761
工作站玩游戲買什麼配置的電腦 發布:2025-02-09 11:49:34 瀏覽:772
奶塊透視腳本群 發布:2025-02-09 11:44:18 瀏覽:543
敢死連狙擊手之無名高地ftp 發布:2025-02-09 11:27:21 瀏覽:583
lol天使輔助腳本 發布:2025-02-09 11:24:39 瀏覽:139
溯源碼怎麼生成 發布:2025-02-09 11:15:15 瀏覽:442
android70flash 發布:2025-02-09 11:15:06 瀏覽:725
如何查看伺服器拒絕信息 發布:2025-02-09 11:13:07 瀏覽:946
靜態編譯失敗怎麼回事 發布:2025-02-09 11:12:54 瀏覽:215
sql能力 發布:2025-02-09 10:43:50 瀏覽:983