码迷,mamicode.com
首页 > 其他好文 > 详细

EF框架step by step(6)—处理实体complex属性

时间:2016-01-13 17:38:20      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

上一篇的中介绍过了对于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属性

标签:

原文地址:http://www.cnblogs.com/weihengblogs/p/5127599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!