zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    winForm ComboBox 控件默认值绑定及只可选择不可输入设定处理
    [c#]CacheHelper缓存类
    access数据库用sql语句添加字段,修改字段,删除字段
    35岁前程序员要规划好的四件事
    C#将网页内容转换成图片保存到本地( webbrowser 可应用于B/S结构中)
    SQL中返回刚插入记录的ID
    JIRA破解
    C#数组查找与排序
    最好的缺陷管理软件下载及破解Jira3.10 Enterprise Edition
    sql2000数据库 sql语句C#分页类代码
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/5127599.html
Copyright © 2011-2022 走看看