Entity Framework(EF)知识整理

来源:互联网 发布:打击网络谣言法律依据 编辑:程序博客网 时间:2024/05/21 06:44

一、专业术语:
     

1.Poco( Plain Old CLR Object的缩写)


 就是那些不包括INSERT、ADD、DEL等数据持久化操作的以及不包括任何业务逻辑功能的原始类。只包含最基本的GETTER 和SETTER如下类:

 public class Category
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
        public byte[] Picture { get; set; }
        public List<Product> Products { get; set; }
    }

如果在POCO在增加持久化操作就不叫POCO了。那是属于领域模型了。



2.DatabaseFirst (基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件)

参考文章:

http://www.cnblogs.com/yangyancheng/archive/2011/04/29/2032817.html

http://www.cnblogs.com/fly_dragon/archive/2011/02/20/1958884.html 



ModelFirst(这种方式是先利用某些工具(如VS的EF设计器)设计出实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件)

参考文章:

http://www.cnblogs.com/yangyancheng/archive/2011/05/03/2035248.html

http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1960230.html


3.CodeFirst(这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型)

参考文章:

http://www.cnblogs.com/yangyancheng/archive/2011/05/05/2037512.html

http://www.cnblogs.com/fly_dragon/archive/2011/02/22/1961730.html


Code First方法默认情况下是以命名空间.DBcontext类名来作为自动创建的数据库名称。我们也可以按如下方法指定数据库名称:

复制代码
public class BlogDbContext : DbContext { /// <summary> /// 新建数据库,并命名为BlogDB, /// </summary> public BlogDbContext() : base("BlogDB") { } public IDbSet<BlogUser> BlogUsers { get; set; } public IDbSet<Post> Posts { get; set; } }
复制代码

code First这种方式也可以用于已存在的数据库,具体作法如下:

第一步:在app.config或者web.config中配置数据库连接字符串

复制代码
<configuration> <connectionStrings> <add name="BlogDB" providerName="System.Data.SqlClient" connectionString="Data Source=.\sqlexpress;Initial Catalog=MyBlogDB;Integrated Security=True"/> </connectionStrings> </configuration>
复制代码

第二步:是让DBcontext获取已存在数据库,在构造DBcontext时,指定使用这个连接字符串

复制代码
public class BlogDbContext : DbContext { /// <summary> /// 会在app.config或者web.config文件中查找BlogDB节,做为连接字符串 /// 但数据库中必须已存在表,即不会重新创建表,这种方法类似DataBase First /// </summary> public BlogDbContext() : base("name=BlogDB") { } public IDbSet<BlogUser> BlogUsers { get; set; } public IDbSet<Post> Posts { get; set; } }
复制代码



二、知识点:

1.延迟加载(当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下,你可能只需要加载部分数据)

               两个步骤: 1.在需要延迟加载的属性前加上virtual ,该属性的类型可以是任务的集合类型ICOLLOCT<T>或者是0/1..1关联属性。

例如,更新Category实体类,使之支持延迟加载

public class Category{  
     public int CategoryID { get;set; }   
     public string CategoryName { get;set; }   
     public string Description { get;set; }  
     public byte[] Picture { get;set; }  
     public virtual List<Product> Products { get;set; }
     ...

2、在context构造器中开启延迟加载功能:

public NorthwindContext() : base("name=NorthwindEntities","NorthwindEntities")
{
    ContextOptions.LazyLoadingEnabled = true;
    _categories = CreateObjectSet<Category>();
    _products = CreateObjectSet<Product>();
}

2.处理实体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



0 0
原创粉丝点击