上一篇的中介绍过了对于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属性的更多相关文章

  1. EF Core中怎么实现自动更新实体的属性值到数据库

    我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...

  2. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  3. 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)

    最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来EF框架生成ADO.net实体模型的话,不利于修改. 主要是解决以下两个问题: 1.比如前端需要一个值,如果存 ...

  4. 释怀我的诺亚尔 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)

    释怀我的诺亚尔   不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco) 最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来E ...

  5. EF框架step by step(5)—处理实体简单属性

    EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...

  6. EF框架step by step(7)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  7. EF框架step by step(8)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  8. EF框架step by step(3)—Code-First

    CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...

  9. EF框架step by step(2)—Model-First

    这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...

随机推荐

  1. iOS 简单提示view

    +(void)showMessage:(NSString *)message{    UIWindow * window = [UIApplication sharedApplication].key ...

  2. 按键的使用(一)------verilog

    按键在项目中应用还是很频繁的,这里主要介绍按键的几种用法. 1.按下一次有效:按下一次计数器增加一下. 2.按下连续有效:按下不松,计数器就一直增加. 3.按下无效,松开有效:按下时计数器值不变,按键 ...

  3. sqlserver 连接远程数据库小结

    A,B两个数据库,不在同一台服务器实例 当需要通过sqlserver语句来实现对远程数据库操作(OPENDATASOURCE): select * from -- 操作类型 OPENDATASOURC ...

  4. Android -- android.os.Parcelable[] cannot be cast to ...

    我本想直接把Bunde.getParcelableArray(...)得到的Parcelable[]强制转换为自定义类数组,但是失败了,网上找了两种解决办法: Parcelable[] data =b ...

  5. Android 反编译 -- apktool、dex2jar、jd-gui

    原文:http://blog.csdn.net/vipzjyno1/article/details/21039349/ apktool 最新官网: http://ibotpeaches.github. ...

  6. route netstat -rn

    -n :不要使用通讯协定或主机名称,直接使用ip或port number; -ee:使用更详细的资讯来显示 [root@NB data]# route -nee Kernel IP routing t ...

  7. APP消息推送:通知和透传

    目前市场上的消息推送方式有两种:通知和透传.什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理.透传消息, ...

  8. Win10开机提示Resume from Hibernation该怎么办?

    Windows10系统的电脑开机提示:Resume from Hibernation(从休眠恢复),这是电脑没有真正关机,而是上次关机时进入了[休眠状态],所以开机时提示:从休眠恢复.如何解决Wind ...

  9. Server.MapPath查询路径那几件事

    主要总结Server.MapPath 这个方法的使用以及使用的场景,不是什么时候都适合使用: 1.实现功能: Server.MapPath能够获取指定URL相对服务器的物理路径,在IIS服务端,能够根 ...

  10. 几年前做家教写的C教程(之二)

    C语言学习宝典(2) 认识C语言中的运算符: (1)算术运算符   (+  -  *  /  %) (2)关系运算符    (>  <  ==  >=  <=  != ) (3 ...