Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在Entity Framework中使用存储过程(一):实现存储过程的自动映射

在Entity Framework中使用存储过程(一):实现存储过程的自动映射

作者头像
蒋金楠
发布于 2018-02-07 09:39:22
发布于 2018-02-07 09:39:22
2.7K0
举报
文章被收录于专栏:大内老A大内老A

之前给自己放了一个比较长的假期,在这期间基本上没怎么来园子逛。很多朋友的留言也没有一一回复,在这里先向大家道个歉。最近一段时间的工作任务是如何将ADO.NET Entity Framework 4.0(以下简称EF)引入到我们的开发框架,进行相应的封装、扩展,使之成为一个符合在特定场景下进行企业级快速开发的ORM。在此过程中遇到了一些挑战,也有一些心得。为了向大家分享这些心得,也为了借助大家的脑袋解决我们遇到的问题,接下来我会写一系列相关的文章。这些文章的读者适合那些对EF有基本了解的人。

第一个主题是关于在EF中使用存储过程的问题。我们知道EF不仅仅支持将一个存储过程(或者用户定义函数)转变成方法,也可以为每一个实体的映射三个Function(ADO.NET Entity Framework的术语,将存储过程和用户自定义函数统称为Function):InsertFunction、UpdateFunction和DeleteFunction,分别用于执行添加、修改和删除操作。虽然通过VS提供的设计器,我们很容易实现存储过程的导入和映射。但是,如果模型中实体和实体属性(数据表中的列)过多,这是一项很繁琐并且容易出错的工作。这篇文章就是如何避免这种烦琐的操作,实现存储过程映射的自动化。[Source Code从这里下载]

目录 一、使用存储过程的必要性 二、实现存储过程自动匹配的必要条件 三、通过T4生成新的.edmx模型 四、看看生成出来的.emdx 五、局限性

一、使用存储过程的必要性

我们知道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模板生成代码?[下篇]》中有过相应的实现),它们具有这样的映射关系。

基于这三种映射关系,我定义了如下一个名为IProcedureNameConverter的接口。其中OperationKind是我自定义的一个表示CUD操作类型的枚举。

代码语言:js
AI代码解释
复制
   1: public interface IProcedureNameConverter
   2: {
   3:     string GetProcedureName(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)。

代码语言:js
AI代码解释
复制
   1: public class DefaultNameConverter: IProcedureNameConverter
   2: {
   3:     public string GetProcedureName(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获取存储过程信息。所有涉及到的文本转化都实现在如下一个ProcedureMappingTemplate类型中,由于内容较多,具体实现就忽略了,有兴趣的朋友可能下载源代码。ProcedureMappingTemplate具有两个构造函数的参数分别表示:源.edmx文件,服务器和数据库名,存储过程的Schema(默认为dbo)和具体的ProcedureNameConverter(默认为DefaultNameConverter)。

代码语言:js
AI代码解释
复制
   1: public class ProcedureMappingTemplate: Template
   2: {
   3:     public XmlDocument SourceModel { get; private set; }
   4:     public IProcedureNameConverter ProcedureNameConverter { get; private set; }
   5:     public Database Database { get; private set; }
   6:     public string Schema { get; private set; }
   7:  
   8:     public ProcedureMappingTemplate(string sourceModelFile, string serverName, string databaseName);
   9:     public ProcedureMappingTemplate(string sourceModelFile, string serverName, string databaseName, 
  10:         IProcedureNameConverter procedureNameConverter, 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模板中创建这个ProcedureMappingTemplate对象,调用Render方法即可。

代码语言:js
AI代码解释
复制
   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.ProcedureMapping.dll" #>
   7: <#@ import namespace="Artech.ProcedureMapping" #>
   8: <#@ include file="T4Toolbox.tt" #>
   9: <#
  10: new ProcedureMappingTemplate(this.Host.ResolvePath("UserModel.edmx"),".","EFExtensions").Render();
  11: #>

四、看看生成出来的.emdx

通过上面创建的TT模板(你指定的数据库中一定要存在具有相应映射关系的存储过程),新的.edmx模型文件会作为该tt文件的依赖文件被生成出来。而这个新生成的.edmx具有存储过程映射信息。具体来说,下面是原始的.edmx文件(只保留元数据节点)。

代码语言:js
AI代码解释
复制
   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

代码语言:js
AI代码解释
复制
   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:         <Function Name="P_USER_I" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" >
  19:           <Parameter Name="p_user_id" Type="varchar" Mode="In" />
  20:           <Parameter Name="p_user_name" Type="nvarchar" Mode="In" />
  21:         </Function>
  22:         <Function Name="P_USER_U" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" >
  23:           <Parameter Name="o_user_id" Type="varchar" Mode="In" />
  24:           <Parameter Name="p_user_name" Type="nvarchar" Mode="In" />
  25:         </Function>
  26:         <Function Name="P_USER_D" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" >
  27:           <Parameter Name="o_user_id" Type="varchar" Mode="In" />
  28:         </Function>
  29:       </Schema>
  30:     </edmx:StorageModels>
  31:     <!-- CSDL content -->
  32:     <edmx:ConceptualModels>
  33:       <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">
  34:         <EntityContainer Name="EFExtensionsEntities" annotation:LazyLoadingEnabled="true">
  35:           <EntitySet Name="Users" EntityType="Artech.UserModel.User" />
  36:         </EntityContainer>
  37:         <EntityType Name="User">
  38:           <Key>
  39:             <PropertyRef Name="ID" />
  40:           </Key>
  41:           <Property Name="ID" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" />
  42:           <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
  43:         </EntityType>
  44:       </Schema>
  45:     </edmx:ConceptualModels>
  46:     <!-- C-S mapping content -->
  47:     <edmx:Mappings>
  48:       <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
  49:         <EntityContainerMapping StorageEntityContainer="ArtechUserModelStoreContainer" CdmEntityContainer="EFExtensionsEntities">
  50:           <EntitySetMapping Name="Users">
  51:             <EntityTypeMapping TypeName="Artech.UserModel.User">
  52:               <MappingFragment StoreEntitySet="T_USER">
  53:                 <ScalarProperty Name="ID" ColumnName="USER_ID" />
  54:                 <ScalarProperty Name="Name" ColumnName="USER_NAME" />
  55:               </MappingFragment>
  56:             </EntityTypeMapping>
  57:             <EntityTypeMapping TypeName="Artech.UserModel.User" >
  58:               <ModificationFunctionMapping>
  59:                 <InsertFunction FunctionName="Artech.UserModel.Store.P_USER_I">
  60:                   <ScalarProperty Name="ID" ParameterName="p_user_id" />
  61:                   <ScalarProperty Name="Name" ParameterName="p_user_name" />
  62:                 </InsertFunction>
  63:                 <UpdateFunction FunctionName="Artech.UserModel.Store.P_USER_U">
  64:                   <ScalarProperty Name="ID" ParameterName="o_user_id" Version="Original" />
  65:                   <ScalarProperty Name="Name" ParameterName="p_user_name" Version="Current" />
  66:                 </UpdateFunction>
  67:                 <DeleteFunction FunctionName="Artech.UserModel.Store.P_USER_D">
  68:                   <ScalarProperty Name="ID" ParameterName="o_user_id" />
  69:                 </DeleteFunction>
  70:               </ModificationFunctionMapping>
  71:             </EntityTypeMapping>
  72:           </EntitySetMapping>
  73:         </EntityContainerMapping>
  74:       </Mapping>
  75:     </edmx:Mappings>
  76:   </edmx:Runtime>
  77: </edmx:Edmx>

顺便来看看.edmx中的数据表T_USER(只具有两个字段USER_ID和USER_NAME)和对应CUD存储过程的SQL。

代码语言:js
AI代码解释
复制
   1: CREATE TABLE [dbo].[T_USER]
   2: (
   3:     [USER_ID]   VARCHAR(50) PRIMARY KEY,
   4:     [USER_NAME] NVARCHAR(50) NOT NULL
   5: )
   6: GO
   7:  
   8: CREATE PROCEDURE [dbo].[P_USER_I]
   9: @p_user_id        VARCHAR(50),
  10: @p_user_name    NVARCHAR(50)
  11:     
  12: AS
  13: BEGIN
  14:     INSERT T_USER(USER_ID, USER_NAME)
  15:     VALUES(@p_user_id,@p_user_name)
  16: END
  17: GO
  18:  
  19: CREATE PROCEDURE [dbo].[P_USER_U]
  20: @o_user_id        VARCHAR(50),
  21: @p_user_name    NVARCHAR(50)
  22:     
  23: AS
  24: BEGIN
  25:     UPDATE T_USER
  26:     SET USER_NAME = @p_user_name
  27:     WHERE USER_ID = @o_user_id
  28: END
  29: GO
  30: CREATE PROCEDURE [dbo].[P_USER_D]
  31: @o_user_id    VARCHAR(50)
  32:     
  33: AS
  34: BEGIN
  35:     DELETE T_USER
  36:     WHERE USER_ID = @o_user_id
  37: END

五、局限性

EF最大的好处就是实现了概念模型和存储模型的分离。你可以为概念实体和存储实体起不同的名称,还可以将一个概念实体映射到多个存储实体,反之亦然。还可以建立概念实体的之间的继承关系。而我们这里提供的存储过程的自动映射机制,却依赖于我们预定义的标准存储过程。换句话说,我们的存储过程是完全依赖与存储模型的,而最终我们需要建立概念模型与存储过程之间的映射,当然会出现问题。

所以这种依赖于标准存储过程的映射机制基本上只能适用于概念模型与存储模型结构一致的情况。但是我相信在真正的开发中,很多人还是采用基于数据库生成.edmx模型的开发发生。如果你不对概念模型的结构(比如拆分、继承)作调整,你可以直接采用本文提供的自动映射机制。如果你需要对概念模型的结构作局部调整,由于我们生成的还是.edmx文件,你可以直接在这上面作调整。

总之一句话,如果你的概念模型和存储模型的结构相差不大,这样的自动存储过程映射机制才有意义。

在Entity Framework中使用存储过程(一):实现存储过程的自动映射 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义? 在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值? 在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-03-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Entity Framework 基础知识走马观花
  (1)通过选择以XML方式打开edmx文件,我们可以可以清楚地看到,edmx模型文件本质就是一个XML文件;
Edison Zhou
2018/08/20
1.4K0
Entity Framework 基础知识走马观花
在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?
继续讨论EF中使用存储过程的问题,这回着重讨论的是为存储过程的参数进行赋值的问题。说得更加具体一点,是如何为实体映射的Delete存储过程参数进行赋值的问题。关于文中涉及的这个问题,我个人觉得是EF一个有待改进的地方,不知道各位看官是否同意? 目录 一、EF存储过程参数赋值的版本策略 二、Delete存储参数就一定是Original值吗? 三、如果直接修改.edmx模型的XML呢? 四、为Delete存储过程参数赋上Current值,如何做得到? 一、
蒋金楠
2018/02/07
1.9K0
在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?
在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
在《实现存储过程的自动映射》中,我通过基于T4的代码生成实现了CUD存储过程的自动映射。由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景。如果两种模型存在差异,在进行数据更新操作的时候就会出错。本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程。 目录 一、创建具有继承关系的实体 二、基于继承关系实体的查询与更新 三、映射标准的CUD存储过程 四、修正存储过程 一、创建
蒋金楠
2018/02/07
1.7K0
在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?
在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?
对于数据库设计来说,多对多(或者一对多)是一种常见的数据关系,比如联系人和地址之间的关系。我们通常采用建立关系表的方式来表示这种关系,比如我们创建一张Contact—_Address(ContactID, AddressID)来存储联系人和地址之间的关系。如果我们最终需要通过存储过程的方式来维护他们之间的关系,该如何做呢?本篇文章给你一个具体的例子来演示如果采用存储过程来建立和删除实体之间的关系。 目录 步骤一、创建数据表 步骤二、创建建立/解除关系的存储过程 步
蒋金楠
2018/02/07
1.3K0
在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?
在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回
本篇文章通过实例的方式,讨论两个在EF使用存储过程的主题:如何通过实体和存储过程的映射实现逻辑删除;对于具有自增长类型主键的数据表,在进行添加操作的时候如何将正确的值反映在实体对象上。 目录 一、基于逻辑删除的数据表和存储过程定义 二、如何过滤逻辑删除记录 三、具有自增长列的存储过程定义 四、通过Result Columns Binding将结果集的列于实体属性进行绑定 一、基于逻辑删除的数据表和存储过程定义 较之物理删除(记录彻底从数据表中清除掉),
蒋金楠
2018/02/07
1.8K0
在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回
Entity Framework快速入门
实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。是微软的一个ORM框架。
老马
2022/05/10
5880
Entity Framework快速入门
MVC5 Entity Framework学习之异步和存储过程
在之前的文章中,你已经学习了如何使用同步编程模型来读取和更新数据,在本节中你将学习如何实现异步编程模型。异步可以使应用程序执行更有效率,因为它可以更有效的使用服务器资源。 同样在本节中你还将学习如何针
逸鹏
2018/04/10
1.4K0
MVC5 Entity Framework学习之异步和存储过程
Entity Framework学习笔记——EF简介(一篇文章告诉你什么是EF)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/41526763
DannyHoo
2018/09/13
2.3K0
Entity Framework学习笔记——EF简介(一篇文章告诉你什么是EF)
entity framework数据库映射(ORM)
Sql Server安装:EntityFramework Mysql安装:MySql.Data.Entity
sofu456
2022/05/06
1K0
entity framework数据库映射(ORM)
Entity Framework快速入门--实例篇 DatabaseFirst
在上一篇中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象。好,废话少说,直入主题。
老马
2022/05/10
5300
Entity Framework快速入门--实例篇  DatabaseFirst
Linq基础知识小记四之操作EF
1、EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Data Model,这提供了额外的灵活性,但在性能和简单性上面也会有所损失. EF的优点:在数据库架构和实体类之间的映射提供了更好的灵活性,还通过程序支持除了SqlServer之外的数据库. Linq To Sql之于EF Linq To Sql和EF师出同门,EF支持LINQ to SQL几乎同样的查询功能,所以
郑小超.
2018/01/26
2.1K0
entity framework数据库映射
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
sofu456
2019/12/03
1K0
Silverlight学习(三)
最近对WCFRIA+MVVM+Prism有了初步的认识,能够简单的实现一些数据库的交互。这节主要讲的是Silverlight通过domainservice和ado.net实体数据模型与数据库的交互。本文的重点是与数据库的交互,包括简单的CURD,以下是实现的一些主要过程: 1.在Sql数据库中新建userinfo表,包括的字段为id,name,age.数据库创建的存储过程为: 1 USE [Test] 2 GO 3 4 /****** Object: Table [dbo].[userinfo]
水击三千
2018/02/27
8180
Silverlight学习(三)
谈谈基于SQL Server 的Exception Handling[中篇]
三、TRY CATCH & Return 在上面一节中,我通过RAISERROR重写了创建User的Stored procedure,实际上上面的Stored procedure是有问题的。我之所以没有立即指出,是因为这是一个很容易犯的错误,尤其是习惯了.NET Exception Handling的人更容易犯这样的错误。我们知道在.NET Application中,如果出现一个未处理的Exception,程序将立即终止,后续的程序将不会执行,但是对于上面的SQL则不一样,虽然我们通过RAISERROR将E
蒋金楠
2018/01/16
9180
谈谈基于SQL Server 的Exception Handling[中篇]
silverlight + wcf(json格式) + sqlserver存储过程分页
silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0的并不多,自个儿琢磨了一下,发现自己弄一个也并非难事,思路和主要代码分享如下: 1.通用的“海量”数据分页存储过程 在做aspx开发时我已经用存储过程分页多年,这个东东是通用的(不管前端用什么语言来做),而且性能也不错,所以这里就直接套过来用了,百度一下"分页存储过程"会有N多版本,这里也给出我自己写的一个版本
菩提树下的杨过
2018/01/22
1.9K0
silverlight + wcf(json格式) + sqlserver存储过程分页
Entity Framework——记录执行的命令信息
有两种方法可以记录执行的SQl语句: 使用DbContext.Database.Log属性 实现IDbCommandInterceptor接口 一 使用DbContext.Database.Log属性
甜橙很酸
2018/03/30
1.1K0
mvc 权限控制续——使用存储过程判断
以前的随笔没有给出数据库,这里给出具体的数据库以及怎么使用存储过程来判断  下面是数据库: /****** Object: Table [dbo].[Resource] Script Date: 03/16/2012 10:43:39 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Resource]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [n
JadePeng
2018/03/12
7180
SQLXML初体验:用XML代替T-SQL来操作数据库
随着Internet的飞速发展,W3C成员意识到必须找到一种办法将数据和Web的表现方式分离出来,于是XML诞生了。当今的XML已经成为IT领域各个数据(特别是文档)的首选格式。由于它具有标记不同字段的能力,因此使搜索变得更简单。从微软发布SQL Server 2000的时候,就读XML数据的存储和检索提供内置的支持。而且微软早已意识到必须对其不断地改进,以便和不断发展的W3C的XML标准保持一致。在微软发布SQL Server 2000的几个月之后,它便在Web站点上发布了完全可以支持XML特性的软件包提
蒋金楠
2018/01/16
2.7K0
SQLXML初体验:用XML代替T-SQL来操作数据库
EntityFramework使用总结(与MVC4.0实现CURD操作)
本篇文介绍一下Entity Framework Code First的简单用法,通过一个学生信息的增删查改来学习Entity Framework的使用及与存储过程的交互。我也是学习Entity Framework新手,有说的不对地方欢迎指正。
写代码的猿
2019/04/11
9270
EntityFramework使用总结(与MVC4.0实现CURD操作)
创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
在《基于T4的代码生成方式》中,我对T4模板的组成结构、语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码。为了让由此需求的读者对T4有更深的了解,我们通过T4来做一些更加实际的事情——SQL Generator。在这里,我们可以通过SQL Generator为某个数据表自动生成进行插入、修改和删除的存储过程。[文中源代码从这里下载] 一、代码生成器的最终使用效果 我们首先来看看通过直接适用我们基于T4的SQL生成模板达到的效果。右图(点击看大图)是
蒋金楠
2018/02/08
3.8K0
创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
推荐阅读
相关推荐
Entity Framework 基础知识走马观花
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档