上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理

这一篇介绍一下Code First方法中,实体Complex属性的处理。Complex属性是将一个对象做为另一个对象的属性。映射到数据库中则子对象表现为多个属性字段。

反之,也就是说,数据库中多个相关字段映射成一个子对象,来进行统一的管理。

complex属性要注意不同于外键引用对象的。

下面用Code First的方式先做个complex属性。

  1. public class Book
    {
    public int BookId { get; set; }
    public string BookTitle { get; set; }
    public Publisher Publisher { get; set; }
  2.  
  3. }
    [ComplexType]
    public class Publisher
    {
    public string PublisherName { get; set; }
    public string PublisherAddress { get; set; }
    }
  4.  
  5. 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

创建数据库,并添加一条测试记录

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

创建后的数据库如图示:

可以清楚的看到,complex属性作数据库的多个字段存在,命名格式为ComplexType.Property

直接获取属性值

第一种方法

  1. var book = db.Books.Find(1);
    ///直接获取complex属性的某个具体属性值
    var pubName = db.Entry(book).Property(b => b.Publisher.PublisherName).CurrentValue;
    Console.WriteLine(pubName);

第二种方法:

  1. var pubName1 = db.Entry(book)
    .ComplexProperty(b => b.Publisher)
    .Property(p => p.PublisherName).CurrentValue;
    Console.WriteLine(pubName1);

第三种方法:

  1. var pubName2 = db.Entry(book).Property("Publisher.PublisherName").CurrentValue;
    Console.WriteLine(pubName2.ToString());

获取complex属性对象

  1. ///获取复杂属性对象
    var pub = db.Entry(book).ComplexProperty<Publisher>(b=>b.Publisher).CurrentValue;
    Console.WriteLine(pub.PublisherName);

如果要全部输出所有属性,这里也提供一个方法

  1. 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]);
    }
    }
    }

调用这个方法的方式如下:

  1. 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. webApp路由控制-vue-router2.0

    安装 直接下载 / CDN https://unpkg.com/vue-router 中文api: http://router.vuejs.org/zh-cn/index.html

  2. Stanford大学机器学习公开课(二):监督学习应用与梯度下降

    本课内容: 1.线性回归 2.梯度下降 3.正规方程组   监督学习:告诉算法每个样本的正确答案,学习后的算法对新的输入也能输入正确的答案   1.线性回归 问题引入:假设有一房屋销售的数据如下: 引 ...

  3. grep如何忽略.svn目录,以及如何忽略多个目录

    grep如何忽略.svn目录,以及如何忽略多个目录 这是我在网上看到的文章,不过里面还有问题,我的不支持,需要更换架包 grep -r 'function_name' * (*表示当前目录下所有文件, ...

  4. cocospod 安装和使用 podfile 问题解决

    Podfile 不识别 usr_framework!,系本地Pods版本太低,要在0.36以上. 以下转自:http://blog.csdn.net/eqera/article/details/393 ...

  5. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  6. How many Fibs?【sudt 2321】【大数的加法及其比较】

    How many Fibs? Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Recall the definition of t ...

  7. 【SQL Server】SQL Server基础之存储过程

    SQL Server基础之存储过程  阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...

  8. golang level

    exp = (currentLevel-1) * 501 02 503 1004 150startLevel = 1currentLevel = 2currentExp = 0

  9. [译] EXTENDING JQUERY – 2.2 A simple plugin

    2.2 一个简单的插件示例 jQuery 插件能做任何事情,这个已经由浩如烟海的各类第三方插件如证明.小到只影响一个元素,大到改变多个元素的外观和行为,jQuery 的各种功能等你来扩展. 2.2.1 ...

  10. poj 2337 欧拉回路输出最小字典序路径 ***

    把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...