EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理
这一篇介绍一下Code First方法中,实体Complex属性的处理。Complex属性是将一个对象做为另一个对象的属性。映射到数据库中则子对象表现为多个属性字段。
反之,也就是说,数据库中多个相关字段映射成一个子对象,来进行统一的管理。
complex属性要注意不同于外键引用对象的。
下面用Code First的方式先做个complex属性。

public class Book
{
public int BookId { get; set; }
public string BookTitle { get; set; }
public Publisher Publisher { get; set; } }
[ComplexType]
public class Publisher
{
public string PublisherName { get; set; }
public string PublisherAddress { get; set; }
} public class BookDbContext : DbContext
{
public BookDbContext() : base("BookDB") {
Database.SetInitializer<BookDbContext>(
new DropCreateDatabaseIfModelChanges<BookDbContext>()
);
}
public IDbSet<Book> Books { get; set; }
}

在上面的代码中,构造了一个Book实体,包含一个complex属性publiser,Pubisher被标明了是ComplexType
创建数据库,并添加一条测试记录

using (BookDbContext db = new BookDbContext())
{ Book newbook = new Book()
{
BookTitle = "EF4.1 step by step",
Publisher = new Publisher()
{
PublisherName = "机械工业",
PublisherAddress = "北京"
}
};
db.Books.Add(newbook);
db.SaveChanges(); }

创建后的数据库如图示:

可以清楚的看到,complex属性作数据库的多个字段存在,命名格式为ComplexType.Property
直接获取属性值
第一种方法
var book = db.Books.Find(1);
///直接获取complex属性的某个具体属性值
var pubName = db.Entry(book).Property(b => b.Publisher.PublisherName).CurrentValue;
Console.WriteLine(pubName);
第二种方法:
var pubName1 = db.Entry(book)
.ComplexProperty(b => b.Publisher)
.Property(p => p.PublisherName).CurrentValue;
Console.WriteLine(pubName1);
第三种方法:
var pubName2 = db.Entry(book).Property("Publisher.PublisherName").CurrentValue;
Console.WriteLine(pubName2.ToString());
获取complex属性对象
///获取复杂属性对象
var pub = db.Entry(book).ComplexProperty<Publisher>(b=>b.Publisher).CurrentValue;
Console.WriteLine(pub.PublisherName);
如果要全部输出所有属性,这里也提供一个方法

public static void WritePropertyValues(string parentPropertyName, DbPropertyValues propertyValues)
{
foreach (var propertyName in propertyValues.PropertyNames)
{
var nestedValues = propertyValues[propertyName] as DbPropertyValues;
if (nestedValues != null)
{
WritePropertyValues(parentPropertyName + propertyName + ".", nestedValues);
}
else
{
Console.WriteLine("Property {0}{1} has value {2}",
parentPropertyName, propertyName,
propertyValues[propertyName]);
}
}
}

调用这个方法的方式如下:
WritePropertyValues("", db.Entry(book).CurrentValues);
EF框架step by step(6)—处理实体complex属性的更多相关文章
- EF Core中怎么实现自动更新实体的属性值到数据库
我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...
- EF框架step by step(7)—Code First DataAnnotations(1)
Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...
- 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来EF框架生成ADO.net实体模型的话,不利于修改. 主要是解决以下两个问题: 1.比如前端需要一个值,如果存 ...
- 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)
释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...
- EF框架step by step(5)—处理实体简单属性
EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(8)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(3)—Code-First
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
- EF框架step by step(2)—Model-First
这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...
随机推荐
- 字符匹配算法之KMP
KMP算法的精华在于从前往后,逐步循环地向前滑动搜索词,来最大限度地减少重复匹配次数,以达到提高效率的目的. 移动位数=已匹配字符数-最后一个匹配字符所对应搜索词的位置[从1开始]. 更加详细且具体的 ...
- FILE文件操作
http://www.jb51.net/article/37688.htm fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FI ...
- 设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)
一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. ...
- 在ubuntu上搭建开发环境2---Win7、Ubuntu双系统正确删除Ubuntu
这种删除ubuntu的方式就是针对本博客中搭建双系统的方式:http://www.cnblogs.com/xumenger/p/4459963.html 如果ubuntu不是以wubi方式安装的,那么 ...
- Shell编程基础教程3--Shell输入与输出
3.Shell输入与输出 3.1.echo echo命令可以显示文本行或变量,或者把字符串输出到文件 echo [option] string ...
- 【翻译十五】-java并发之固定对象与实例
Immutable Objects An object is considered immutable if its state cannot change after it is construct ...
- 使用getopt函数对windows命令行程序进行参数解析
getopt()是libc的标准函数,很多语言中都能找到它的移植版本. // -b -p "c:\input" -o "e:\test\output" bool ...
- JetBrains发布了IntelliJ IDEA 2016.1
JetBrains日前发布了IntelliJ IDEA 2016.1,即他们最受欢迎的IDE的最新版本.这个新版本应该是考虑了多语言开发者的需求,其在许多语言和技术都有很多的增强:然而最惹人注目的变化 ...
- 获得H.264视频分辨率的方法
转自:http://www.cnblogs.com/likwo/p/3531241.html 在使用ffmpeg解码播放TS流的时候(例如之前写过的UDP组播流),在连接时往往需要耗费大量时间.经过d ...
- HR外包系统 - 工资计算-几种常见账单计算规则
01-正常工资计税 (包括同一月多地计税方式) 02-年终奖计税 (包括可分批发放,但计税总额不变) 按工资 除以月份,看落在那个计税区间,获取税率和扣除数,再用总额*税率-扣除数,要考虑当月工资如 ...