准备工作:
- 将Visual Studio 2008及.NET Framework 3.5升级到SP1。点击转到升级地址。
- 安装SQL SERVER 2005,VS 2008中自带的EXPRESS版的SQL SERVER应该也可以用。
- 下载并附加数据库:点击下载DemoDb。
- 创建一个VB Application,注意,目标Framework要设置成3.5版。
查询实例:
1. 创建映射
在项目上右击添加新项目,选择新出现的"ADO.NET Entity Data Model",命名为NotebookDb.edmx。
点击"添加"后出现实体数据模型向导。这时,选择"从数据库生成",建立好相应的数据连接之后,在下方给实体数据模型设定一个名称(示例中使用默认名称DemoDbEntities),并且点击"下一步"。
进入选择表的步骤。我们暂且把两个表全部都选上。点击"完成"。
这样,一个看似LinQ to SQL 的实体数据模型设计器就展现在眼前了。
我们看到,两个表对应映射成了两个实体,这两个实体中有两类属性,分别为"Scalar Property"和"Navigation Property";两个实体之间,还形成了一个1对多的关系。如果大家看过一点UML,对这种关系符号一定不会感觉陌生。Visual Studio下方,映射详细信息面板自动开启。当我们选择一个实体时,它自动显示实体与表的列之间的映射关系。列到属性,数据库类型到.NET类型……一目了然。
2. 根据需要,修改映射
由于实体数据模型存在于客户端,故其修改不会对数据库造成影响。也就是说,我们可以根据应用程序的需要,修改映射关系,并且这种修改不会影响数据库。这一特点,会在同一企业不同领域使用共享的数据存储,不同的领域模型的情况下带来受益。我们来试着删除Weight的映射。实在是超级简单啊,在实体上右击,点击"删除",观察一下映射详细信息面板:Weight已经被删除了。
3. 使用LINQ to Entity查询并输出结果
最后,我们来试试怎么通过LinQ to Entity把查询结果输出。无论如何,LinQ就是LinQ,LinQ查询就脱离不了我们在VB 9.0新特性之LINQ(一)中提到的那三步:
- 确立数据源
- 创建查询
- 执行查询
我们的代码也对应着这三步进行:
Sub Main() 'Create Entity Set Dim db As New DemoDbEntities()
'Create Query Dim query = From aLaptop In db.NotebookStorage _ Select aLaptop
'Execute Query For Each aLaptop In query Console.WriteLine(aLaptop.Brand & vbTab & aLaptop.Type & vbTab & aLaptop.Price) Next End Sub |
编译。如果大家使用下载的数据库,就会发现,编译无法通过,有一个错误:
Error 3023: Problem in Mapping Fragment starting at line 92: Column NotebookStorage.Weight in table NotebookStorage must be mapped: It has no default value and is not nullable. E:\...\EFWalkThrough\NotebookDb.edmx 93 15 EFWalkThrough |
呵呵,看来,刚才删除的列是不被允许了,因为数据库中有一个约束,要求必须有此列。我们要把它添加回去。打开实体数据模型设计器,右击,添加一个"Scalar Property"并给它取个名称:"重量",设置对应的"Nullable"属性为"False"。
然后,在"映射详细信息"面板中,通过下拉选择框,把表中的Weight列映射到刚才新建的"重量"属性。
顺手修改一下输出语句:
Console.WriteLine(aLaptop.Brand & vbTab & aLaptop.Type & vbTab & aLaptop.Price & vbTab & aLaptop.重量) |
好,F5,编译运行。输出结果如下:
大家注意到了输出结果中,重量全部都变成了2?呵呵,看一下重量的数据类型便知道其中缘故了吧。^_^
小结:
在本文中,我们Step by step的创建一个数据实体模型;然后,对实体模型中的映射关系作了修改(删除映射、添加映射);我们还使用LinQ to Entity把数据从实体对象集中查询并输出到了屏幕。
本文中源代码下载。
Little knowledge is dangerous.