当前位置:首页 » 存储配置 » edm存储

edm存储

发布时间: 2023-12-31 22:30:11

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

㈡ 计算机设备名称英语词汇

计算机设备名称英语词汇

计算机可以由个人需要,组合多种设备。下面是我分享的计算机设备英语名称,希望能对大家有所帮助!

磁盘

AAT(Average access time,平均存取时间)

ABS(Auto Balance System,自动平衡系统)

ASMO(Advanced Storage Magneto-Optical,增强形光学存储器)

AST(Average Seek time,平均寻道时间)

ATA(AT Attachment,AT扩展型)

ATOMM(Advanced super Thin-layer and high-Output Metal Media,增强形超薄高速金属媒体)

bps(bit per second,位/秒)

CAM(Common Access Model,公共存取模型)

CSS(Common Command Set,通用指令集)

DMA(Direct Memory Access,直接内存存取)

DVD(Digital Video Disk,数字视频光盘)

EIDE(enhanced Integrated Drive Electronics,增强形电子集成驱动器)

FAT(File Allocation Tables,文件分配表)

FDBM(Fluid dynamic bearing motors,液态轴承马达)

FDC(Floppy Disk Controller,软盘驱动器控制装置)

FDD(Floppy Disk Driver,软盘驱动器)

GMR(giant magnetoresistive,巨型磁阻)

HDA(head disk assembly,磁头集合)

HiFD(high-capacity floppy disk,高容量软盘)

IDE(Integrated Drive Electronics,电子集成驱动器)

LBA(Logical Block Addressing,逻辑块寻址)

MBR(Master Boot Record,主引导记录)

MTBF(Mean Time Before Failure,平均故障时间)

PIO(Programmed Input Output,可编程输入输出模式)

PRML(Partial Response Maximum Likelihood,最大可能部分反应,用于提高磁盘读写传输率)

RPM(Rotation Per Minute,转/分)

RSD:(Removable Storage Device移动式存储设备)

SCSI(Small Computer System Interface,小型计算机系统接口)

SCMA:(SCSI Configured Auto Magically,SCSI自动配置)

S.M.A.R.T.(Self-Monitoring, Analysis and Reporting Technology,自动监测、分析和报告技术)

SPS(Shock Protection System,抗震保护系统)

STA(SCSI Trade Association,SCSI同业公会)

Ultra DMA(Ultra Direct Memory Access,超高速直接内存存取)

LVD(Low Voltage Differential)

Seagate硬盘技术DiscWizard(磁盘控制软件)

DST(Drive Self Test,磁盘自检程序)

SeaShield(防静电防撞击外壳)

RAM & ROM

ABP: (Address Bit Permuting,地址位序列改变)

ATC(Access Time from Clock,时钟存取时间)

BSRAM(Burst pipelined synchronous static RAM,突发式管道同步静态存储器)

CAS(Column Address Strobe,列地址控制器)

CCT(Clock Cycle Time,时钟周期)

DB: (Deep Buffer深度缓冲)

DDR SDRAM(Double Date Rate,双数据率SDRAM)

DIL(al-in-line)

DIMM(Dual In-line Memory Moles,双重内嵌式内存模块)

DRAM(Dynamic Random Access Memory,动态随机存储器)

DRDRAM(Direct RAMbus DRAM,直接RAMbus内存)

ECC(Error Checking and Correction,错误检查修正)

EEPROM(Electrically Erasable Programmable ROM,电擦写可编程只读存储器)

FM: (Flash Memory快闪存储器)

FMD ROM (Fluorescent Material Read Only Memory,荧光质只读存储器)

PIROM:(Processor Information ROM,处理器信息ROM)

PLEDM: Phase-state Low Electron(hole)-number Drive Memory QBM(Quad Band Memory,四倍边带内存)

RAC(Rambus Asic Cell,Rambus集成电路单元)

RAS(Row Address Strobe,行地址控制器)

RDRAM(Rambus Direct RAM,直接型RambusRAM)

RIMM(RAMBUS In-line Memory Moles,RAMBUS内嵌式内存模块)

SDR SDRAM(Single Date Rate,单数据率SDRAM)

SGRAM(synchronous graphics RAM,同步图形随机储存器)

SO-DIMM(Small Outline Dual In-line Memory Moles,小型双重内嵌式内存模块)

SPD(Serial Presence Detect,串行存在检查)

SRAM(Static Random Access Memory,静态随机存储器)

SSTL-2(Stub Series Terminated Logic-2)

TSOPs(thin small outline packages,超小型封装)

USWV(Uncacheable, Speculative, Write-Combining非缓冲随机混合写入)

VCMA(Virtual Channel Memory architecture,虚拟通道内存结构)

;
热点内容
广数编程p 发布:2024-11-28 20:38:37 浏览:665
sql2008vs2010 发布:2024-11-28 20:38:34 浏览:373
编译plc程序 发布:2024-11-28 20:28:49 浏览:916
母婴源码 发布:2024-11-28 20:23:13 浏览:299
ftp标题下划线怎么添加 发布:2024-11-28 20:23:09 浏览:793
电脑金铲铲之战服务器已满怎么办 发布:2024-11-28 20:09:58 浏览:618
脚本六要素 发布:2024-11-28 19:41:07 浏览:986
linuxoralce 发布:2024-11-28 19:39:51 浏览:608
4k存储量 发布:2024-11-28 19:39:36 浏览:825
php动态链接 发布:2024-11-28 19:34:16 浏览:151