博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF框架step by step(6)—处理实体complex属性
阅读量:6903 次
发布时间:2019-06-27

本文共 3135 字,大约阅读时间需要 10 分钟。

上一篇的中介绍过了对于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
( new DropCreateDatabaseIfModelChanges
() ); } public IDbSet
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
(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);

转载地址:http://mlldl.baihongyu.com/

你可能感兴趣的文章
【LeetCode】187. Repeated DNA Sequences
查看>>
JS高级前端开发群加群说明及如何晋级
查看>>
Spring 3.1 Environment Profiles--转载
查看>>
Python 的三目运算
查看>>
继承、复写、重载等总结
查看>>
SQL 语句转换格式函数Cast、Convert
查看>>
其实,SSL也不是配通了就什么都不管的~~
查看>>
请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间【转】
查看>>
10个强大的Javascript表单验证插件推荐
查看>>
北邮iptv用WindowsMediaplayer打不开的解决的方法
查看>>
软件发布版本区别介绍-Alpha,Beta,RC,Release
查看>>
cdoj 1143 传输数据 最大流
查看>>
loadrunner 学习笔记--AJAX
查看>>
a5调试
查看>>
cocoa 的大招(KVC的几点强大应用记录)
查看>>
IOS7 导航栏适配二
查看>>
第1章 游戏之乐——NIM(3)两堆石头的游戏
查看>>
eclipse中新建python项目报错:Project interpreter not specified
查看>>
如何在Linux上实现文件系统的自动检查和修复?
查看>>
jquery ajax调用返回json格式数据处理
查看>>