Article View: cn.bbs.comp.database
Article #646[VS2008]Data Access Options in VS2008
From: Galaxy��VOLUNTEERS��Database
Date: Tue, 02 Dec 2008 01:48
Date: Tue, 02 Dec 2008 01:48
220 lines
11152 bytes
11152 bytes
http://www.devx.com/codemag/Article/39751
n Visual Studio 2008 running on the .NET framework 3.5, developers can not
only create DataReaders and DataSets; Microsoft has also added LINQ to SQL,
Entity Framework, and ADO.NET Data Services, which leverages the first two.
These new options of course, mean that you have new syntaxes to learn.
LINQ, which is built into Visual Basic and C#, has one implementation for
LINQ to SQL and another for LINQ to Entities. In Entity Framework, you have
the option to use LINQ to Entities or make queries in two other ways with
Entity SQL (see Figure 1).
Figure 1. Data Access Options in .NET 3.5: Of the six data access options
available, four are new.
In all, developers have gone from one "out-of-the-box" data access option
plus a native query language of choice (e.g. T-SQL) to six different data
access options with new query syntaxes. That sounds pretty scary. On the
other hand, having a range of choices offers developers the flexibility to
choose the right tool for the job rather than have to constantly "make do"
with the existing tools.
Author's Note: ADO.NET Data Services (aka Astoria) is a great way to expose
Entity Framework and LINQ to SQL models over the web. Because it provides a
wrapper around these technologies, it doesn't fit into the particular goals
of this article. One important point to be aware of, however, is that it
solves a number of the problems that LINQ to SQL and Entity Framework
developers are running into when using these models in Web and WCF
services, most of which are around persisting change tracking across tiers.
A great place to start with ADO.NET Data Services is the team's blog.
Because of the number of data access options available, this article will
focus on those that are native to .NET and Visual Studio; however, you
should know that there are many third-party tools such as object relational
mappers (ORM) and frameworks that you can use as well.
This article is not aimed at teaching you how to use the various data
access technologies. While it does discuss some specifics of the different
APIs, you should be able to benefit from the examples without too much
prior knowledge of or experience with LINQ to SQL or Entity Framework. The
goal here is to focus on some of the most prominent differences between the
options so you'll have enough information to know which option makes sense
for your scenario. You can then drill into the appropriate technology to
learn more.
The examples in this article are based on unmodified versions of the
AdventureWorksLT and Northwind databases, because they're already familiar
to many readers.
Not All Databases Are Created Equal
The availability of database providers for a given data access option may
impact your choice. Myriad well-established data providers exist for
ADO.NET and Microsoft, such as SqlClient, OracleClient, OleDBClient.
Numerous third-party providers are also available if you're not using SQL
Server or Oracle, but you'll need to check to make sure one exists for your
particular database.
In comparing LINQ to SQL to the other options, it is important to keep in
mind that it works only with SQL Server databases.
Entity Framework can work with any database for which a provider exists.
Microsoft has written the provider for SQL Server and included it with
Entity Framework. So far, LINQ to SQL works only with SQL Server databases
(2000+, Express, Compact 3.5). Matt Warren, one of the originators of LINQ
to SQL, has a blog series on building IQueryable providers.
As of late spring 2008, vendors have released beta versions of a number of
providers that work with Entity Framework Beta 3, including Oracle, MySQL,
PostgreSQL and a few IBM databases. David Sceppa at Microsoft is working
with the provider writers. His blog maintains a list of who is currently
working on the providers and when they should be available.
Entity Framework will not support OleDB providers. Entity Framework needs
to transform query expressions into a form recognizable by a particular
database. Because OleDB does not target a specific database, this isn't
possible.
Data Access Code Interactions
ADO.NET, LINQ to SQL, and Entity Framework all have different relationships
to the data store.
ADO.NET Works Against the Database
Using ADO.NET, you query the database directly, so you're required to have
a very good understanding of the database schema. You must know the names
of the stored procedures, views, and tables as well as the names and types
of the parameters. Depending on how you handle the data upon return, you
may also need to be well-versed in the schema of the return data. Strongly
typed DataSets and TableAdapters make this significantly simpler because
you can discover the schema through IntelliSense��and they'll take care of
some of the connection functions for you.
LINQ to SQL Works Against a Model Database Representation
Figure 2. Simple Model: Here's a simple LINQ to SQL data model built from
three tables in the AdventureWorksLT database.
You write LINQ to SQL queries against classes generated from the database.
You can use a designer to do this work or code your classes manually.
Figure 2 shows a simple model built from three tables in the database. The
existing one-to-many relationships were automatically identified by the
designer.
Behind the visual model lies a set of classes and properties with
attributes that point to the database tables and columns represented in the
model. For example, the following SalesOrderDetail class declaration shows
that it is bound directly to the database table through an attribute:
<Table
(Name:="SalesLT.SalesOrderDetail")> _
Partial Public Class SalesOrderDetail
The properties are tightly bound as well.
<Column _
(Storage:="_SalesOrderDetailID", _
AutoSync:=AutoSync.OnInsert, _
DbType:="Int NOT NULL IDENTITY",_
IsPrimaryKey:=True, _
IsDbGenerated:=True)> _
Public Property SalesOrderDetailID() _
As Integer
Writing LINQ to SQL queries is simpler not only because of the strongly
typed classes, but because the relationships between the classes are
strongly typed as well.
While you can customize the model somewhat, it's still a one-to-one
representation of the database. Therefore, in effect, LINQ to SQL classes
represent the database, so writing queries feels as though you are
constructing strongly typed queries against the database itself.
IntelliSense not only helps you with the operators (SELECT, WHERE, FROM,
etc.) but with the tables and related data as well.
You'll see more detail about customization later.
Entity Framework Works Against a Conceptual Model that Maps Back to the
Database
You write Entity Framework queries against a conceptual model called an
"Entity Data Model" (EDM), as pictured in Figure 3. The EDM is very
different from the database model used by LINQ to SQL, because it is
loosely coupled to the database while the LINQ to SQL classes are tightly
bound to the tables and columns in the target database.
Figure 3. Entity Data Model: The EDM consists of a Conceptual layer, a
Storage layer, and a Mapping layer in between. This enables the conceptual
schema which you program against to be loosely coupled to the database.
Figure 4. Model View: The figure shows an EDM in the Entity Framework
Designer.
Figure 4 shows the conceptual layer of an Entity Data Model in the Entity
Framework designer that was created from the same three tables as the LINQ
to SQL model.
While the LINQ to SQL model is based on a set of classes, the EDM is based
on XML schema files used to automatically generate code classes.
Need maximum performance? Hands down, ADO.NET data readers are faster than
LINQ to SQL or Entity Framework queries
The auto-generated classes are not bound to the database. Instead, they
point back to the conceptual model and inherit from the EntityObject class.
The code snippet below shows a representation of the SalesOrderDetail
class. For clarity, I have removed some of the class attributes and Visual
Basic's requisite line-wrapping underscores:
<Global.System.Data.Objects
.DataClasses.EdmEntityTypeAttribute
(NamespaceName:=
"AdventureWorksLTModel",
Name:="SalesOrderDetail"), _
Partial Public Class SalesOrderDetail
Inherits Global.System.Data.Objects
.DataClasses.EntityObject
The properties also have attributes, but there is no mention of the
database columns that they map to:
<Global.System.Data.Objects
.DataClasses. _
EdmScalarPropertyAttribute( _
EntityKeyProperty:=true, _
IsNullable:=false), _
Public Property SalesOrderDetailID() _
As Integer
Figure 5. Abstraction Layers: ADO.NET, LINQ to SQL, and the Entity
Framework all have different layers of separation from the database.
The Entity Data Model also contains an XML representation of the database
and mappings that describe how entities and their properties map back to
objects in the database. As with LINQ to SQL, lower level APIs transform
Entity Framework queries into native queries in the database and then
return DataReaders, which can be used directly or materialized into objects.
While it is possible to create an EDM that matches the database, EDM truly
shines in scenarios where you can benefit by querying against a conceptual
model that has been highly customized to match your business needs.
Additionally, because of the loose coupling, it is possible to use a single
(well-defined) conceptual layer with different databases merely by creating
a new store/mapping layer pair to act as a bridge. It's not a walk in the
park to do this, but can definitely be worth the effort if it solves your
business needs.
Figure 5 summarizes the layers of abstraction between the database and
these three data access tools.
--
Welcome to Database Board
��ӭ������ݿ��
http://bbs.sjtu.edu.cn/bbsdoc?board=database
[m[1;33m�� ��Դ:����ˮ˼Դ bbs.sjtu.edu.cn��[FROM: 207.46.55.29][m
Technical Details
Message-ID:
<4dHPFT$bCf@bbs.sjtu.edu.cn>Path:
arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!news4.google.com!proxad.net!feeder1-2.proxad.net!194.25.134.126.MISMATCH!newsfeed01.sul.t-online.de!t-online.de!news.isoc.lu!news.shec6.edu.cn!SJTUShow Full Headers
Complete Article Headers
X-Google-Thread: 101948,b93148f6bf7292bb,start X-Google-Attributes: gid101948,domainid0,public,usenet X-Google-Language: ENGLISH,GB Path: arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!news4.google.com!proxad.net!feeder1-2.proxad.net!194.25.134.126.MISMATCH!newsfeed01.sul.t-online.de!t-online.de!news.isoc.lu!news.shec6.edu.cn!SJTU From: Dem.bbs@bbs.sjtu.edu.cn (Galaxy��VOLUNTEERS��Database) Newsgroups: cn.bbs.comp.database Subject: [VS2008]Data Access Options in VS2008 Date: 02 Dec 2008 01:48:51 GMT Organization: ��ˮ˼Դ Message-ID: <4dHPFT$bCf@bbs.sjtu.edu.cn> Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit X-Filename: database/M.1228182509.A Lines: 220