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


    上一篇的中介绍过了对于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);
  • 相关阅读:
    实现Path2.0中绚丽的的旋转菜单
    ColorMatrixColorFilter颜色过滤(离线用户的灰色头像处理)
    网上发现的一个android UI包
    圆角背景的ListView
    自定义Gallery 滑动中图片自动突出显示
    python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)
    Linux(deepin) 系统: 解决 matplotlib 中文乱码问题
    python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)
    API接口防止参数篡改和重放攻击
    API接口防止参数篡改和重放攻击
  • 原文地址:https://www.cnblogs.com/Alex80/p/5141086.html
Copyright © 2020-2023  润新知