当前位置:首页 » 存储配置 » entityframework存储过程

entityframework存储过程

发布时间: 2022-05-20 20:07:51

㈠ ado.net entity framework 调用存储过程

查询存储过程的写法:

BlogContext db =newBlogContext();
sqlParameter[] parms =newSqlParameter[1];
parms[0]=newSqlParameter("@ID",1);
var result = db.Articles.SqlQuery("exec P_GetArticleByID @ID", parms);
returnView(result);

㈡ Entity Framework怎么调用存储过程

SqlParameter[] parms = new SqlParameter[2];
SqlParameter id = new SqlParameter("ID", "11a44466-6d9c-4c7e-b9e4-5a1369061119");
id.SqlDbType=SqlDbType.NVarChar;
id.Size = 128;
parms[0] = id;
var outParam = new SqlParameter();
outParam.ParameterName = "Name";
outParam.SqlDbType = SqlDbType.VarChar;
outParam.Size = 64; //必须填写正确,否则会有这种异常:{"String[1]: the Size property has an invalid size of 0."}
outParam.Direction = ParameterDirection.Output;
parms[1]=outParam;

//当有这样异常时,"... A member of the type ... does not have a corresponding column in the data reader with the same name"
//是存储过程返回的字段名与对应Model的属性名对不上, 解决加法是在存储过程中取别名与Model的属性同名
var result = db.Database.SqlQuery<Category>("P_GetCategoryByID @ID,@Name output", parms);

string title = outParam.Value as string;

㈢ 在 MVC+Entity Framework 的开发中调用存储过程,出现奇怪的问题

改过model没,改了的话要做数据库迁移

㈣ entity framework 使用存储过程删除数据后,还用再使用SaveChanges()保存吗

执行存储过程后是直接执行了SQL语句 但是如果不适用 SaveChanges()保存的话 EF在内存维护的数据会没有改变 如果不注意一下的话 可能会引起读取的是旧数据 也就是读取的是内存中的数据。 EF 有些方法是会先读取内存中维护的数据如果没有才会从数据库中执行SQL语句读取数据库中的数据的。 使用 SaveChanges() 方法是非常重要的 当然最安全的就是执行方法结束后 立即SaveChanges() 但要是操作的方法涉及到多个执行语句 那么就建议全部执行完成后保存

㈤ 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值

四、为Delete存储过程参数赋上Current值,如何做得到?一、EF存储过程参数赋值的版本策略和传统的基于DataSet的ADO.NET类似,EF的核心功能之一就是“状态追踪(State Tacking)”。这中间实际上又涉及到两个方面:通过状态决定数据更新的类型(Insert、Update和Delete);以及同时保存不同版本的属性值(Current值和Original值)。版本策略主要是针对Update操作设计的,一般来讲组成Where条件的为Original值,而更新的值为Current值。正是因为只有Update操作才需要显式指定映射的是实体属性值的版本(Current/Original),所以在进行实体/存储过程映射的时候,只有Update存储过程才可以选择“是否采用原始值(Use Original Value)”。Insert和Delete存储过程默认的版本为Current和Original。反映在VS的.edmx模型设计器上就是:只有Update存储过程的参数映射才具有“Use Original Value”这个复选框。二、Delete存储参数队应的就一定是Original值吗?粗略地想想,EF这样设计也无可厚非:Insert存储过程用于添加一条全新的记录,自然应该采用当前值;而Delete存储过程用于删除一条现有的记录,删除操作的筛选条件自然应该使用原始值。但是,我们忽略掉一点:Delete存储过程一定非得执行删除操作吗?如果我进行“逻辑删除”,实际上进行的是Update操作。关于逻辑删除的实现,可以参阅我上一篇文章《逻辑删除的实现与自增长列值返回》。如果你看了我提到的这篇文章,你可能会问,即使在文中介绍的关于“逻辑删除”的场景中,也没有使用当前值得要求呀。是的,上一篇文章提到的逻辑删除确实也只需要传入实体属性的原始值作为Delete存储过程的参数,现在我们就举一个这样的例子。通过是使用T_CONTACT这张简单不过的表,同样是采用逻辑删除。不过现在有这样的一个要求,对于条存储在的记录,我们需要记录最后修改者是谁。对于一条被逻辑删除掉的记录,这个最后修改者就是删除掉该条记录的人。这是一个很常见的需求,为此我们可以直接在T_CONTACT的数据表中添加一个新的字段:LAST_UPDATED_BY,创建该表的DDL定义如下: 1:CREATETABLE [T_CONTACT] 2: ( 3: [ID] [INT] IDENTITY(1,1) PRIMARYKEY, 4: [NAME] [NVARCHAR](50) NOTNULL, 5: [IS_DELETED] [BIT] NOTNULL, 6: [LAST_UPDATED_BY] [NVARCHAR](50) NOTNULL 7: )那么对于Delete存储过程,除了指定需要删除的记录的主键之外,还需要将当前用户名作为参数作为传进来。这样的一个存储过程具有如下的定义 1:CREATEPROCEDURE [dbo].[P_CONTACT_D] 2: ( 3: @p_id INT, 4: @user_name NVARCHAR(50) 5: ) 6:AS 7:BEGIN 8:UPDATE T_CONTACT 9:SET IS_DELETED = 1, 10: LAST_UPDATED_BY = @user_name 11:WHERE ID = @p_id 12:END在实际操作场景下,我们需要先获取一条现有的Contact记录,然后将其标记为删除。然后Delete存储过程被执行,并且采用预先定义好的实体属性/参数的映射关系来对存储过程的参数进行赋值。但是,由于Delete存储过程默认使用的是实体对象的初始值,即使你在删除之前为Contact对象的LastUpdatedBy属性设置了新的值,该值也不可能传入到存储过程中去。三、如果直接修改.edmx模型的XML呢?由于Delete过程只能接受实体的映射属性的初始值作为参数,导致我们无法指定一个新的值作为参数。我想有人会有这样的疑问:VS提供的设计器不能提供你指定Delete存储过程参数版本的功能,你是否可以直接修改.edmx文件的XML呢?我们不妨来尝试一下:在整个XML中,实体的CUD存储过程映射对应如下一段XML片段,我们可以看到,只有UpdateFunction中的参数映射节点才有Version属性(而且这是一个必需的属性),用于指定参数定义的是Original值还是Current值。 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:那些现在我们将DeleteFunction的user_name参数的映射节点人为地加上Version=“Current”属性设置。 1: 2: 3: 4:但是当你进行编译的时候,会出现如下的错误,明确告诉你:“This function mapping can only contain bindings to 'original' property versions.”四、为Delete存储过程参数赋上Current值,如何做得到?从上面的介绍我们不难发现,Delete存储过程不能接受基于当前值得参数映射,并不仅仅是设计器不支持,EF本来就是这样设计的。在这种情况下要实现我们的要求,只有一个办法:将当前值转化成初始值值,这样的转变通过调用ObjectContext的AcceptAllChanges方法可以实现。具体来说,对于需要删除的实体,现设定LastUpdatedBy属性,然后调用AcceptAllChanges方法,然后再调用ObjectStateManager的ChangeObjectState方法将状态设置为Deleted。最终通过调用SaveChanges方法提交更新,具体的代码如下: 1:staticvoid Main(string[] args) 2: { 3:using (EFExtensionsEntities context = new EFExtensionsEntities()) 4: { 5: Contact contact = new Contact { Name = "Foo", LastUpdatedBy = "Bar" }; 6: context.Contacts.AddObject(contact); 7: context.SaveChanges(); 8: Console.WriteLine("{0}: {1}", contact.ID, contact.Name); 9: 10: contact.LastUpdatedBy = "Baz"; 11: context.AcceptAllChanges(); 12: context.ObjectStateManager.ChangeObjectState(contact, EntityState.Deleted); 13: context.SaveChanges(); 14: } 15: }执行上面的程序后,你会在数据库中发现为删除对象指定的LastUpdatedBy属性“Baz”,而不是初始值“Bar”最终反映在数据库中。虽然通过“曲线救国”我们可以实现为实体映射的Delete存储过程指定一个“新值”作为某个参数的值,但是这样的做法总觉得不怎么优雅。所以,我个人觉得这是EF一个值得改进的地方,让Delete存储过程和Update一样,也可以指定不同的版本。在Entity Framework中使用存储过程(一):实现存储过程的自动映射在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回

㈥ net entity framework 存储过程 能直接返回 datatable吗

似乎没有内置的函数,不过既然你想用datatable,直接用sqldataadapter不就好了?

㈦ Entity Framework 5.0 调用存储过程 返回值为什么是int类型

存储过程的返回值类型固定为int类型,不支持其它类型,函数才可以返回多样化类型。如果你要通过存储过程传递数据出来,请使用输出型参数。
这是SQL的基础知识,和C#无关。

㈧ 在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。

热点内容
python多行注释的快捷键 发布:2024-11-15 08:09:14 浏览:956
c1脚本病毒 发布:2024-11-15 07:59:04 浏览:611
为什么淘宝上的阿里云服务器便宜 发布:2024-11-15 07:58:49 浏览:547
数据库怎么找 发布:2024-11-15 07:58:47 浏览:176
前海开源新经济灵活配置混合是什么板块 发布:2024-11-15 07:45:33 浏览:556
数据结构基本算法 发布:2024-11-15 07:45:09 浏览:289
安卓怎么调60帧和平精英 发布:2024-11-15 07:28:58 浏览:733
404跳转php 发布:2024-11-15 07:28:56 浏览:674
苹果缓存视频在哪里 发布:2024-11-15 07:23:31 浏览:921
车解压密码 发布:2024-11-15 07:23:30 浏览:87