Evil 域

当Evil遇上先知

导航

ADO.NET Entity Framework 试水——持久

Posted on 2008-08-20 21:01  Saar  阅读(3562)  评论(16编辑  收藏  举报

ORM在数据库编程中,充当持久层的作用——持久,将数据持久化到数据库中。通过持久层,可以方便的将我们平时所作的增、删、改操作"固化"到数据库中去。本文将通过一个实例,来看看ADO.NET Entity Framework中如何对数据库进行CRUD操作。

为了便于说明,我们这里选用了极其简单的例子。虽然,实际情况会比这个示例复杂得多,但是,其操作模式是一样的。

 

一、准备工作

 

要完成本文的示例,我们需要:

  1. 将Visual Studio 2008及.NET Framework 3.5升级到SP1。点击转到升级地址
  2. 安装SQL SERVER 2005,VS 2008中自带的EXPRESS版的SQL SERVER应该也可以用。
  3. 下载并附加数据库:点击下载DemoDb
  4. 创建一个VB Application,注意,目标Framework要设置成3.5版。
  5. 完成数据库到实体数据模型的映射。具体方法请参考:《ADO.NET Entity Framework 试水——掠影》。

附加数据库后,大家可以顺便查看一下数据库当前的状况。我这边的数据库当前状况如下:

完成映射后,在实体数据模型设计器里看到的情形大致如下:

 

二、增加实体

 

目标:在数据库中插入一行数据,存放一个笔记本信息——品牌:华硕;型号:A8;单价:6500.00;重量:2.2千克。

''' <summary>

''' Performs insert

''' </summary>

''' <remarks></remarks>

Public Sub Add()

    'Create an ObjectContext

    Using db As New DemoDbEntities()

 

        'Create a new entity

        Dim newLaptop = New NotebookStorage With _

            {.Brand = "华硕", _

             .Type = "A8", _

             .Price = 6500.0, _

             .重量 = 2.2}

 

        'Add entity to entity set

        db.AddToNotebookStorage(newLaptop)

    

        'Persist changes

        db.SaveChanges()

    End Using

End Sub

在插入的模式中,我们首先,建立了一个ObjectContext。

在Create a new entity部分,我们创建了一个实体(Entity),实体的名字叫newLaptop,在现实生活中,这对应了一台笔记本电脑。它的实体类(Entity Type)是"NotebookStorage"。这个类规定了它有品牌、型号、单价、重量等属性。因此,我们运用了一个对象初始化器,将给实体的属性赋以具体的值。

在Add entity to entity set部分,我们通过.AddToNotebookStorage方法,将上一步中新建的实体,添加到了实体集(Entity Set)中。

在Persist changes部分,我们通过一个叫SaveChanges()的方法,将数据持久化到了数据库中。编译运行后,如果大家查询一下数据库,就可以看到新增的行了:

 

 

三、修改实体

 

目标:在数据库中,将所有品牌为"华硕"的笔记本数据行中的值改为"ASUS"。

''' <summary>

''' Performs Update

''' </summary>

''' <remarks></remarks>

Public Sub Modify()

    'Create an ObjectContext

    Using db As New DemoDbEntities

        'Query the entities to modify

        Dim query = From asusLaptop In db.NotebookStorage _

                    Where asusLaptop.Brand = "华硕" _

                    Select asusLaptop

        'Retrieve the entities and modify it

        For Each asusLaptop In query

            asusLaptop.Brand = "ASUS"

        Next

        'Persist changes

        db.SaveChanges()

 

    End Using

End Sub

在更新模式中,我们首先创建了一个ObjectContext。

在Query the entities to modify部分,我们通过LinQ to Entity创建了一个查询,查询出全部品牌为"华硕"的实体。

在Retrieve the entities and modify it中,我们通过一个For Each循环,给查询出来的每一个实体的品牌属性赋新的值"ASUS"。

最后,在Persist changes部分,仍然通过SaveChange()方法,将变动持久化到了数据库。

更新后的数据库如情况如下:

 

 

四、删除实体

 

目标:删除所有品牌中带有"HP"的笔记本的行。

''' <summary>

''' Performs Delete

''' </summary>

''' <remarks></remarks>

Public Sub Delete()

    'Create an ObjectContext

    Using db As New DemoDbEntities

        'Query the entities to delete

        Dim query = From hpLaptop In db.NotebookStorage _

                    Where hpLaptop.Brand.Contains("HP") _

                    Select hpLaptop

        'Retrieve the entities and delete it

        For Each hpLaptop In query

            db.DeleteObject(hpLaptop)

        Next

        'Persist changes

        db.SaveChanges()

    End Using

End Sub

在删除模型中,我们第一步做的,仍然是创建一个ObjectContext。

在Query the entities to delete部分中,我们依然跟修改数据一样,通过一个LinQ to Entities把要删除的实体给查询出来。

然后,通过一个For Each循环,把所有查询到的实体删除掉。在SaveChanges()之前,所有针对实体的变动,都不会被保存到数据库中。

为了持久化,我们调用db.SaveChanges(),系统自动把相应的变动持久化到数据库中。

删除了含"HP"的笔记本记录之后的数据库表情况如下:

 

五、小结

 

本文主要介绍了ADO.NET Entity Framework中的增、删、改操作。通过这一示例,大家可以看到,利益于ORM,我们所有的增删改操作被Object Service捕获,并通过SaveChanges()方法将其持久化到数据库中,从而摆脱了原先的书写SQL语句、执行SQL语句等复杂的操作。

 

六、示例代码下载

 

点击下载

 

===返回索引===