上一篇的中介绍过了对于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 ; }
}
创建数据库,并添加一条测试记录
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);