EF框架step by step(6)—处理实体complex属性
2016-01-13 16:12
363 查看
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理
这一篇介绍一下Code First方法中,实体Complex属性的处理。Complex属性是将一个对象做为另一个对象的属性。映射到数据库中则子对象表现为多个属性字段。
反之,也就是说,数据库中多个相关字段映射成一个子对象,来进行统一的管理。
complex属性要注意不同于外键引用对象的。
下面用Code First的方式先做个complex属性。
在上面的代码中,构造了一个Book实体,包含一个complex属性publiser,Pubisher被标明了是ComplexType
创建数据库,并添加一条测试记录
创建后的数据库如图示:
可以清楚的看到,complex属性作数据库的多个字段存在,命名格式为ComplexType.Property
直接获取属性值
第一种方法
第二种方法:
第三种方法:
获取complex属性对象
如果要全部输出所有属性,这里也提供一个方法
调用这个方法的方式如下:
这一篇介绍一下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);
相关文章推荐
- 深度学习BP算法的推导(附加RNN,LSTM的推导说明)
- Python 整理一
- AngularJS单选框及多选框实现双向动态绑定
- scrollview中嵌套viewpager 导致显示不全或者不显示问题
- OKHttp使用简介
- IOS使用ijkPlayer
- os x系统下安装mysql
- Hadoop 的发展史和版本
- Linux (ubuntu) 下常用操作指令学习
- Hadoop-HDFS架构
- 得到网页中的图片链接
- python 集合
- 两款较好的Web前端性能测试工具
- 设置Listview不滚动
- Linux学习之给指定用户发邮件
- ubuntu修改iP地址
- EF框架step by step(5)—处理实体简单属性
- EF框架step by step(4)—DBcontext应用于已存在数据库
- c#中对集合排序
- 你没看错!TCL品牌日10万台洗衣机免费送