Entity Framework 学习中级篇1—EF支持复杂类型的实现

实体框架EF(Entity Framework)简介 是微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。提供变更追踪,唯一性约束,惰性加载、查询事务等功能。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。使用场景:ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。ORM是将数据存储从域对象自动映射到关系数据库的工具。ORM主 阅读详情

本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。

通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如果要在EF中实现这个目的,那么我们就需要用到复杂类型。

目前,由于EF不能显示支持复杂类型,所以我们无法在VS里的可视化设计器里面来设计我们需要的复杂类型。所以,我们需要手动修改实体模型,以便使其支持复杂类型的属性。修改的主要步骤有以下几步:

l         产生实体模型

l         修改CSDL文件

l         修改msl文件

l         重新生成模型实体类

在后续的介绍,我使用数据库使用的是NorthWind,并针对Customer表对应的实体类来增加复杂属性Address,其中复杂属性Address由Address,City,Region,Country和PostalCode这个几个组合而成。

下面,介绍具体的操作步骤:

第一步:产生实体模型

实体模型的产生我们可以直接通过在VS可视化设计器来产生(如果不会,请参考《Entity Framework 学习初级篇1--EF基本概况》)。或者使用EdmGen工具来产生(EdmGen工具位于:系统盘符:/WINDOWS/Microsoft.NET/Framework/v3.5下面)。具体步骤就不复述了。

我产生的实体模型文件是:NorthwindEnites.edmx

第二步:修改csdl文件

产生了实体模型后,我们使用记事本或其他文本编辑工具打开实体模型,(小技巧:可以把实体模型后缀.edmx改为.xml,然后把实体模型文件直接拖到VS里面进行修改,这样修改起来比较方便,待修改完毕后,将后缀改回来即可。)

接着,开始手动修改csdl文件,找到模型文件中关于csdl定义的部分,然后找到实体类型名为Customers的定义节,删除原来的Address,City,Region,Country,PostalCode属性定义,然后添加一个名为Address的属性,如下代码所示:

       <EntityType Name="Customers">

          <Key>

            <PropertyRef Name="CustomerID" />

          </Key>

          <Property Name="CustomerID" Type="String" Nullable="false" MaxLength="5" Unicode="true" FixedLength="true" />

          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />

          <Property Name="ContactName" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />

          <Property Name="ContactTitle" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />

          <Property Name="Address" Type="NorthwindModel.CommonAddress" Nullable="false"></Property>

          <Property Name="Phone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />

          <Property Name="Fax" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />

          <NavigationProperty Name="Orders" Relationship="NorthwindModel.FK_Orders_Customers" FromRole="Customers" ToRole="Orders" />

          <NavigationProperty Name="CustomerDemographics" Relationship="NorthwindModel.CustomerCustomerDemo" FromRole="Customers" ToRole="CustomerDemographics" />

        </EntityType>

接着,需要添加一个名为CommonAddress复杂类型的定义,具体如下代码:

<ComplexType Name="CommonAddress">

          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />

          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />

          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />

        </ComplexType>

至此,csdl部分修改完毕。

第三步,修改msl文件:

找到msl部分的定义,修改Customers部分的影射定义。具体代码如下(请注意ComplexProperty节):

<EntitySetMapping Name="Customers">

            <EntityTypeMapping TypeName="IsTypeOf(NorthwindModel.Customers)">

              <MappingFragment StoreEntitySet="Customers">

                <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />

                <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />

                <ScalarProperty Name="ContactName" ColumnName="ContactName" />

                <ScalarProperty Name="ContactTitle" ColumnName="ContactTitle" />

                <ComplexProperty Name="Address" TypeName="NorthwindModel.CommonAddress">

                  <ScalarProperty Name="Address" ColumnName="Address" />

                  <ScalarProperty Name="City" ColumnName="City" />

                  <ScalarProperty Name="Region" ColumnName="Region" />

                  <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />

                  <ScalarProperty Name="Country" ColumnName="Country" />

                </ComplexProperty>

                <ScalarProperty Name="Phone" ColumnName="Phone" />

                <ScalarProperty Name="Fax" ColumnName="Fax" />

              </MappingFragment>

            </EntityTypeMapping>

  </EntitySetMapping>

至此,msl部分修改完毕

第四步:重新产生实体类文件。

我们可以使用EmdGen2工具来重新实体类.cs文件。具体操作如下:

将修改好的模型文件(edmx),拷贝到使用edmgen2.exe同目录下,然后在命令行中输入:

Edmgen2 /codegen cs NorthwindEnites.edmx

执行此命令后,会在当前的文件夹下生成一个NorthwindEnites.cs代码文件,也就是实体类的代码文件。将改文件改名为:NorthwindEnites.Designer.cs(这步主要是和edmx对应起来)。

然后,将NorthwindEnites.edmx和NorthwindEnites.Designer.cs文件添加到项目中。

至此,复合类型的修改完毕。

按照同样的修改过程,我们可以给Employees也增加一个Address的复杂类型属性。

接下来,我们看看具体使用代码:

l         查询:

[Test]

        public void TestAddress()

        {

            using (var db = new NorthwindModel.NorthwindEntities1())

            {

                Console.WriteLine("Get Five customer addresss :");

                var cts = db.Customers.Take(5);

                foreach (var c in cts)

                {

                    Console.WriteLine("Address:{0},Country:{1},City:{2},PostalCode:{3}", c.Address.Address, c.Address.Country, c.Address.City, c.Address.PostalCode);

                }

                Console.WriteLine("Get Five Employess address:");

                var emp = db.Customers.Take(5);

                foreach (var c in emp)

                {

                    Console.WriteLine("Address:{0},Country:{1},City:{2},PostalCode:{3}", c.Address.Address, c.Address.Country, c.Address.City, c.Address.PostalCode);

                }

            }

        }

l         添加:

[Test]

        public void AddTest()

        {

            using (var db = new NorthwindModel.NorthwindEntities1())

            {

                var customer = new NorthwindModel.Customers

                {

                    CustomerID = "2009",

                    CompanyName = "Complex Company",

                    ContactName = "xray2005",

                    Address = new NorthwindModel.CommonAddress

                    {

                        Address = "SiChuan,China",

                        City = "ChengDou",

                        Country = "China",

                        PostalCode = "610041",

                        Region = "Chenghua"

                    }

                };

                db.AddToCustomers(customer);

                db.SaveChanges();

                var cst = db.Customers.FirstOrDefault(c => c.CustomerID == "2009");

                Assert.IsNotNull(cst);             

                Console.WriteLine("CustomerID:{0},CompanyName:{1},ContactName:{2},City:{3},Country:{4}", cst.CustomerID, cst.CompanyName, cst.ContactName, cst.Address.City, cst.Address.Country);

            }

        }

l         条件查询:

[Test]

        public void QueryTest()

        {

            using (var db = new NorthwindModel.NorthwindEntities1())

            {

                var cst = db.Customers.FirstOrDefault(c => c.Address.City == "ChengDou");

                Assert.IsNotNull(cst);       

                Console.WriteLine("CustomerID:{0},CompanyName:{1},ContactName:{2},City:{3},Country:{4}", cst.CustomerID, cst.CompanyName, cst.ContactName, cst.Address.City, cst.Address.Country);

            }

        }

最后,补充说明:

1,  在VS的可视化设计器里,不支持复杂类型,所以修改后无法再在可视化设计器里修改模型(edmx文件)。

2,  复杂类型不能单独存在,它必须和某一实体相关起来。

3,  复杂类型不能包含导航属性,如导航到实体或实体集。

4,  复杂类型具有内部结构但没有 Key(主键) 属性的数据类型

下面是示例代码和EdmGen2工具的连接。

示例代码  EdmGen2

 
     本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  转自:  ♂风车车.Net
EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时, 阅读详情

相关推荐

EF框架

EF框架,全称Entity Framework,即实体框架 一、EF简介: 它微软提供的一种ORM工具,支持面向数据的软件应用程序的技术。ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。那么ORM是什么?ORM (对象关系映射)是将数据存储从域对象自动映射到关系型数据库的工具。ORM主要包括3个部分:域对象、关系数据库对象、映射关系。通过使用ORM,我们

宋文轩 1万+

ASP.NET 完美解决checkbox多选传值以及相关操作

小项目要用到多选,修改相关数据记录: 效果如下: 具体实现如下: 用到了GridView控件。 --------------------------------------------------------------------------------------------------------------------------------------- GridView是...

weixin_33725515的博客 499

Entity Framework Core (EF Core) 技术报告

摘要:Entity Framework Core (EF Core) 是微软推出的轻量级、跨平台ORM框架,通过.NET对象与数据库交互,减少SQL编写需求。核心功能包括对象映射、关系映射、查询翻译和变更跟踪。广泛应用在电商、CMS、ERP、移动应用和医疗系统中,支持复杂数据建模和高效查询。学习曲线中等,需掌握C#、LINQ和数据库知识,但官方文档丰富。示例展示了博客系统的实体定义、DbContext配置和CRUD操作。EF Core是.NET项目关系型数据库访问的主流选择,显著提升开发效率。

ponygame的博客 681

根据checkbox 中value的值 使checkbox变成选中状态

//checkbox的回选 根据后台传入的值,显示多选按钮的选中状态: function return1(){ //得到两个数组 var itemNameList = $('#objItemName').val().trim().split(','); var itemIdList ...

fulong0406的博客 2207

EF5 DBContext与Entity分离成独立项目

EF的全称是Entity Framework,是微软推出的一款ORM框架,通过面向对象的思想抽象数据库访问层,自动生成与数据库表结构的映射关系。默认生成的.edmx文件下同时生成了.context.tt和entity.tt文件,接下来的操作是要讲entity.tt的数据实体文件分离到独立的类库项目中去。

Kylin-Desktop-V10-SP1海光版虚拟机安装全流程(含桥接网络配置)

本文详细介绍了在VMware虚拟机中安装Kylin-Desktop-V10-SP1海光版操作系统的完整流程,重点解决了基于海光(Hygon C86)平台的网络配置难题。内容涵盖从镜像准备、虚拟机创建、系统安装到桥接网络配置的三种实战方法,并提供了安装后的优化与必备软件配置指南,帮助用户高效搭建国产化测试与开发环境。

weixin_29323493的博客 355

解决获取多个checkbox值的问题

当你模糊查询的时候遇到需要传多个checkbox值的时候,就很苦恼(如下所示)按照上面的步骤即可解决获取多个checkbox的问题实现模糊查询!

qq_53808097的博客 571

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局

本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。

weixin_31967485的博客 386

页面如何获取checkbox选中的多个值?

一:通过js获取 先定义一个CheckBox: html: <input type="checkbox" name="test" value="1"/><span>1</span> <input type="checkbox" name="test" value="2"/><span>2</span> <inpu...

**My Coding Family** 7484

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 192

Homebrew高效升级与国内镜像源配置全攻略

本文详细介绍了如何通过配置国内镜像源(如清华、中科大、阿里云)来高效升级Homebrew,解决国内开发者访问GitHub仓库速度慢的问题。文章提供了从基础配置到永久生效的完整教程,包括常见问题解决和进阶技巧,帮助开发者大幅提升软件包管理效率。

weixin_28835551的博客 416

Entity Framework 学习中级篇1—EF支持复杂类型的实现

Entity Framework 学习中级篇1—EF支持复杂类型的实现   本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想

snowalkmount的专栏 460

QT+SOEM主站协议库实战指南—从编译到嵌入式应用

本文提供了一份QT与SOEM开源EtherCAT主站协议库的集成实战指南。详细介绍了在Windows和Linux平台下编译SOEM库的步骤,并讲解了如何将其无缝集成到QT项目中,构建具备实时监控与控制功能的工业上位机应用。内容涵盖从环境搭建、核心协议开发到嵌入式部署与优化的全流程,为开发高性价比、自主可控的工业控制解决方案提供完整路径。

u6v7w8x的博客 440

Entity Framework 学习中级篇1—EF支持复杂类型的实现(转)

本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性。当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如...

weixin_33859844的博客 93

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

Entity Framework 学习中级篇—EF支持复杂类型的实现

http://www.cnblogs.com/xray2005/archive/2009/06/01/1493661.html 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作。 通常,复杂类型是指那些由几个简单的类型组合而成的类型。比如:一张Customer表,其中有FristName和LastName字段,那么对 应的Customer实体类将会有F...

fhuan123的专栏 582

C# NX二次开发-查找连续倒圆角面

可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。

fhqiwmc的博客 618

EF (Entity Framework) vs LINQ to SQL vs SqlSugar 全方位对比分析

本文对比了三种.NET ORM框架:Entity Framework、LINQ to SQL和SqlSugar。EF作为微软官方ORM功能全面但较复杂,适合大型企业应用;LINQ to SQL轻量简单但仅支持SQL Server,适合小型项目;SqlSugar由中国开发者开发,性能优异且支持多数据库,特别适合国内开发场景。三者各具特色,开发者应根据项目规模、数据库需求及团队熟悉度进行选择,其中EF适合复杂业务系统,LINQ to SQL适合简单SQL Server项目,而SqlSugar在性能和易用性方面表

百锦再的博客 1773

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Entity Framework 学习初级篇1--EF基本概况

最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品。不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善。而且,现在基本上所有数据库均提供了对EF的支持。因此,为以后做技术准备可以学习研究以下。但是,我个人觉得就目前来说,在实际项目慎用此框架。 下面简单的介绍以下这个EF。 在.Net Framework SP1微软包含一个实体框架(...

diyuanqie0472的博客 111

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务
下一篇: Entity Framework 学习中级篇2—存储过程(上)
迷途笛音
博客等级 码龄19年 27粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值