EF4.1之复杂类型
首先我们生成两张对应表:
public class Client
{
public int ClientID { set; get; }
public string ClientName { set; get; } //此时 这个 Address 并不想要在数据库里面 生成对应的 数据表, 比如我们要丰富 业务逻辑,想要设置必填项,
//想要 把这个 复杂的属性 映射到 表中的字段
//要想要 生成到 Client 对应的 字段 使用 标注就不能实现了,,所以这时 要在 构建器里面进行设置
public Address ResidentialAddress { set; get; }
public Address DeliveryAddress { set; get; }
} public class Address
{
public int StreetNumber { set; get; }
public string StreetName { set; get; }
}
我定义了两个类,但是我并不想生成两张表,而是下面那样的生成一张表:

我们可以看出,我们这样做而没有是将所有的属性都定义到一张表里面,这样是可以丰富我们的模型。但是这个时候想要通过标注来限制我的模型是不行的,设个时候就要用到模型构建器了。
modelBuilder.Entity<Client>().Property(c => c.ClientID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Client>().Property(c => c.ClientName).IsRequired().HasMaxLength(); //下面是重点 首先,将 Address设置为 复杂属性 然后 将 Address 里面的属性对应 生成到 Client 数据表的字段
modelBuilder.ComplexType<Address>();//将 类 Address 设置成 复杂属性
//这个复杂属性 也可以 用标注的 方式 加在类的 上面[ComplexType],,但是下面的生成 到数据库表的 字段 modelBuilder.Entity<Client>().Property(c => c.ResidentialAddress.StreetName).HasColumnName("ResAddressStreetName").IsRequired().HasMaxLength();
modelBuilder.Entity<Client>().Property(c => c.ResidentialAddress.StreetNumber).HasColumnName("ResAddressStreetNum").IsRequired();
modelBuilder.Entity<Client>().Property(c => c.DeliveryAddress.StreetName).HasColumnName("DelAddressStreetName").IsRequired().HasMaxLength();
modelBuilder.Entity<Client>().Property(c => c.DeliveryAddress.StreetNumber).HasColumnName("DelAddressStreetNum").IsRequired();
但是使用复杂模型一定要注意一点:
就是复杂类型就是为null ,就不行不对其进行赋值,就是赋值一个所有属性都为null的对象也是要进行赋值的。同样的道理:EF获得实体模型的时候即使是获得实体的所有的属性都为null,也是会返回一个实体。
EF4.1之复杂类型的更多相关文章
- EF之POCO应用系列2——复杂类型
在.NET开发中,EF4以前的版本以及LINQ TO SQL都不支持complex数据类型,EF4终于支持complex类型的数据了,这意味着微软的EF框架朝领域驱动方面又迈了一大步. 复杂的数据类型 ...
- .NET中 类型,对象,线程栈,托管堆在运行时的关系
.NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...
- MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决
博客写了10篇了~有很多朋友私信问了一些问题,而且很多问题 大家问的都一样 这里说说这些常见问题的解决办法.如果大家有更好的解决办法~也希望分享出来 问题大概为这几个 一.ef4.1 codeFirs ...
- MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例
基于EF4.1 code first 简单的CRUD 园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来 争取写些别人 ...
- MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化
上篇文章中 我们已经创建了EF4.1基于code first的例子 有了数据库 并初始化了一些数据 今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...
- Entity Framework 4.1:复杂类型
这篇文章将讨论复杂类型. 默认情况下,EF4.1 将类映射到表,这是约定,但是有时候,我们需要模型比表的粒度更细一些. 地址是一个典型的例子,看一下下面的客户类. )] publicstring St ...
- 【.net 深呼吸】细说CodeDom(5):类型成员
前文中,老周已经厚着脸皮介绍了类型的声明,类型里面包含的自然就是类型成员了,故,顺着这个思路,今天咱们就了解一下如何向类型添加成员. 咱们都知道,常见的类型成员,比如字段.属性.方法.事件.表示代码成 ...
- 【.net 深呼吸】细说CodeDom(4):类型定义
上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
随机推荐
- 【Stirling Number】
两类Stirling Number的简介与区别(参考自ACdreamer的CSDN) Stirling Number I --- s(n,k):将n个物体排成k个非空循环排列(环)的方法数. 递推式: ...
- hdu 2844 多重背包+单调队列优化
思路:把价值看做体积,而价值的大小还是其本身,那么只需判断1-m中的每个状态最大是否为自己,是就+1: #include<iostream> #include<algorithm&g ...
- 区间求mex的两种方法
区间求mex的两种方法 1.莫队+分块/莫队+二分+树状数组 2.线段树 预处理1-i的sg值(用一个vis数组,一个cur指针) 预处理nxt数组(a[nxt[i]]=a[i]) 枚举左端点l, 考 ...
- Magento事件机制 - Magento Event/Observer
为了扩展Magento的功能,我们可以重写Magento的代码,但因为代码只能被重写一次,所以当多个模块需要重写同一部分的代码时,就会引起冲突,好在Magento提供了另一种扩展功能的方法:事件机制, ...
- Contoso 大学 - 使用 EF Code First 创建 MVC 应用
原文 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 Contoso 大学 Web 示例应用演示了如何使用 EF 技术创建 ASP.NET MVC 应用.示例中的 Co ...
- php中preg_match用户名正则实例
例子,字母.数字和汉字 代码如下 复制代码 if(preg_match("/[ '.,:;*?~`!@#$%^&+=)(<>{}]|]|[|/|\|"||/& ...
- 【Unix环境高级编程】编写变长参数函数
文件的格式输入输出函数都支持变长参数.定义时,变长参数列表通过省略号'...'表示, 因此函数定义格式为: type 函数名(parm1, parm2,parmN,...); Unix的变长参数通过v ...
- Cocos2d-x中背景音乐播放暂停与继续
背景音乐播放暂停与继续似乎我们很少使用,事实上也正是如此,背景音乐播放暂停与继续实例代码如下: SimpleAudioEngine::getInstance()->pauseBackground ...
- 32位系统下使用4GB内存
64位系统的驱动还有不少缺陷,果断重装回32位系统,但是4gb的内存,明显是浪费啊. 所以必须利用起来. 我没有采用不稳定的破解内核的做法,采用了虚拟硬盘的做法.因为个人觉得这样其实利用效率更高. 方 ...
- MAC系统介绍
MACOS: UNIX系统图形界面的显示 开发环境: 一种是终端(terminal) 一种是Xcode(ide) MAC快捷键: command(window) + c : 复制 command + ...