本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。
Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。使用它可以快速构建自己的开发模式。
1:基础结构
首先,创建SL APP,如下:
然后,选择创建web:
可以,也可以不勾选enable wcf ria service,如果勾选了,在SL APP中会多几个DLL的引用,其它没有任何差别。如图:
这是一个小而轻型的数据库,在mdsN的课程中有使用到它。如下:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO USE [master]; GO IF EXISTS (SELECT * FROM sys.databases WHERE name = 'School') DROP DATABASE School; GO -- Create the School database. CREATE DATABASE School; GO -- Specify a simple recovery model -- to keep the log growth to a minimum. ALTER DATABASE School SET RECOVERY SIMPLE; GO USE School; GO -- Create the Department table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Department]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Department]( [DepartmentID] [int] NOT NULL,[Name] [nvarchar](50) NOT NULL,[Budget] [money] NOT NULL,[StartDate] [datetime] NOT NULL,[Administrator] [int] NULL,CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED ( [DepartmentID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the Person table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Person]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Person]( [PersonID] [int] IDENTITY(1,1) NOT NULL,[LastName] [nvarchar](50) NOT NULL,[FirstName] [nvarchar](50) NOT NULL,[HireDate] [datetime] NULL,[EnrollmentDate] [datetime] NULL,CONSTRAINT [PK_School.Student] PRIMARY KEY CLUSTERED ( [PersonID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OnsiteCourse table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OnsiteCourse]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OnsiteCourse]( [CourseID] [int] NOT NULL,[Location] [nvarchar](50) NOT NULL,[Days] [nvarchar](50) NOT NULL,[Time] [smalldatetime] NOT NULL,CONSTRAINT [PK_OnsiteCourse] PRIMARY KEY CLUSTERED ( [CourseID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OnlineCourse table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OnlineCourse]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OnlineCourse]( [CourseID] [int] NOT NULL,[URL] [nvarchar](100) NOT NULL,CONSTRAINT [PK_OnlineCourse] PRIMARY KEY CLUSTERED ( [CourseID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO --Create the StudentGrade table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[StudentGrade]( [EnrollmentID] [int] IDENTITY(1,[CourseID] [int] NOT NULL,[StudentID] [int] NOT NULL,[Grade] [decimal](3,2) NULL,CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED ( [EnrollmentID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the CourseInstructor table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CourseInstructor]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[CourseInstructor]( [CourseID] [int] NOT NULL,[PersonID] [int] NOT NULL,CONSTRAINT [PK_CourseInstructor] PRIMARY KEY CLUSTERED ( [CourseID] ASC,[PersonID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the Course table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Course]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[Course]( [CourseID] [int] NOT NULL,[Title] [nvarchar](100) NOT NULL,[Credits] [int] NOT NULL,[DepartmentID] [int] NOT NULL,CONSTRAINT [PK_School.Course] PRIMARY KEY CLUSTERED ( [CourseID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Create the OfficeAssignment table. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OfficeAssignment]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[OfficeAssignment]( [InstructorID] [int] NOT NULL,[Timestamp] [timestamp] NOT NULL,CONSTRAINT [PK_OfficeAssignment] PRIMARY KEY CLUSTERED ( [InstructorID] ASC )WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO -- Define the relationship between OnsiteCourse and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OnsiteCourse_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[OnsiteCourse]')) ALTER TABLE [dbo].[OnsiteCourse] WITH CHECK ADD CONSTRAINT [FK_OnsiteCourse_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[OnsiteCourse] CHECK CONSTRAINT [FK_OnsiteCourse_Course] GO -- Define the relationship between OnlineCourse and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OnlineCourse_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[OnlineCourse]')) ALTER TABLE [dbo].[OnlineCourse] WITH CHECK ADD CONSTRAINT [FK_OnlineCourse_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[OnlineCourse] CHECK CONSTRAINT [FK_OnlineCourse_Course] GO -- Define the relationship between StudentGrade and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_StudentGrade_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[StudentGrade]')) ALTER TABLE [dbo].[StudentGrade] WITH CHECK ADD CONSTRAINT [FK_StudentGrade_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[StudentGrade] CHECK CONSTRAINT [FK_StudentGrade_Course] GO --Define the relationship between StudentGrade and Student. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_StudentGrade_Student]') AND parent_object_id = OBJECT_ID(N'[dbo].[StudentGrade]')) ALTER TABLE [dbo].[StudentGrade] WITH CHECK ADD CONSTRAINT [FK_StudentGrade_Student] FOREIGN KEY([StudentID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[StudentGrade] CHECK CONSTRAINT [FK_StudentGrade_Student] GO -- Define the relationship between CourseInstructor and Course. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CourseInstructor_Course]') AND parent_object_id = OBJECT_ID(N'[dbo].[CourseInstructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK ADD CONSTRAINT [FK_CourseInstructor_Course] FOREIGN KEY([CourseID]) REFERENCES [dbo].[Course] ([CourseID]) GO ALTER TABLE [dbo].[CourseInstructor] CHECK CONSTRAINT [FK_CourseInstructor_Course] GO -- Define the relationship between CourseInstructor and Person. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_CourseInstructor_Person]') AND parent_object_id = OBJECT_ID(N'[dbo].[CourseInstructor]')) ALTER TABLE [dbo].[CourseInstructor] WITH CHECK ADD CONSTRAINT [FK_CourseInstructor_Person] FOREIGN KEY([PersonID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[CourseInstructor] CHECK CONSTRAINT [FK_CourseInstructor_Person] GO -- Define the relationship between Course and Department. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Course_Department]') AND parent_object_id = OBJECT_ID(N'[dbo].[Course]')) ALTER TABLE [dbo].[Course] WITH CHECK ADD CONSTRAINT [FK_Course_Department] FOREIGN KEY([DepartmentID]) REFERENCES [dbo].[Department] ([DepartmentID]) GO ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_Department] GO --Define the relationship between OfficeAssignment and Person. IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OfficeAssignment_Person]') AND parent_object_id = OBJECT_ID(N'[dbo].[OfficeAssignment]')) ALTER TABLE [dbo].[OfficeAssignment] WITH CHECK ADD CONSTRAINT [FK_OfficeAssignment_Person] FOREIGN KEY([InstructorID]) REFERENCES [dbo].[Person] ([PersonID]) GO ALTER TABLE [dbo].[OfficeAssignment] CHECK CONSTRAINT [FK_OfficeAssignment_Person] GO -- Create InsertOfficeAssignment stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertOfficeAssignment]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[InsertOfficeAssignment] @InstructorID int,@Location nvarchar(50) AS INSERT INTO dbo.OfficeAssignment (InstructorID,Location) VALUES (@InstructorID,@Location); IF @@ROWCOUNT > 0 BEGIN SELECT [Timestamp] FROM OfficeAssignment WHERE InstructorID=@InstructorID; END ' END GO --Create the UpdateOfficeAssignment stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UpdateOfficeAssignment]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[UpdateOfficeAssignment] @InstructorID int,@Location nvarchar(50),@OrigTimestamp timestamp AS UPDATE OfficeAssignment SET Location=@Location WHERE InstructorID=@InstructorID AND [Timestamp]=@OrigTimestamp; IF @@ROWCOUNT > 0 BEGIN SELECT [Timestamp] FROM OfficeAssignment WHERE InstructorID=@InstructorID; END ' END GO -- Create the DeleteOfficeAssignment stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DeleteOfficeAssignment]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[DeleteOfficeAssignment] @InstructorID int AS DELETE FROM OfficeAssignment WHERE InstructorID=@InstructorID; ' END GO -- Create the DeletePerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DeletePerson]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[DeletePerson] @PersonID int AS DELETE FROM Person WHERE PersonID = @PersonID; ' END GO -- Create the UpdatePerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UpdatePerson]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[UpdatePerson] @PersonID int,@LastName nvarchar(50),@FirstName nvarchar(50),@HireDate datetime,@EnrollmentDate datetime AS UPDATE Person SET LastName=@LastName,FirstName=@FirstName,HireDate=@HireDate,EnrollmentDate=@EnrollmentDate WHERE PersonID=@PersonID; ' END GO -- Create the InsertPerson stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertPerson]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[InsertPerson] @LastName nvarchar(50),@EnrollmentDate datetime AS INSERT INTO dbo.Person (LastName,FirstName,HireDate,EnrollmentDate) VALUES (@LastName,@FirstName,@HireDate,@EnrollmentDate); SELECT ScopE_IDENTITY() as NewPersonID; ' END GO -- Create GetStudentGrades stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetStudentGrades]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[GetStudentGrades] @StudentID int AS SELECT EnrollmentID,Grade,CourseID,StudentID FROM dbo.StudentGrade WHERE StudentID = @StudentID ' END GO -- Create GetDepartmentName stored procedure. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetDepartmentName]') AND type in (N'P',N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N' CREATE PROCEDURE [dbo].[GetDepartmentName] @ID int,@Name nvarchar(50) OUTPUT AS SELECT @Name = Name FROM Department WHERE DepartmentID = @ID ' END GO -- Insert data into the Person table. USE School GO SET IDENTITY_INSERT dbo.Person ON GO INSERT INTO dbo.Person (PersonID,LastName,EnrollmentDate) VALUES (1,'Abercrombie','Kim','1995-03-11',null); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (2,'Barzdukas','Gytis',null,'2005-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (3,'Justice','Peggy','2001-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (4,'Fakhouri','Fadi','2002-08-06',EnrollmentDate) VALUES (5,'Harui','Roger','1998-07-01',EnrollmentDate) VALUES (6,'Li','Yan','2002-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (7,'norman','Laura','2003-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (8,'Olivotto','Nino',EnrollmentDate) VALUES (9,'Tang','Wayne',EnrollmentDate) VALUES (10,'Alonso','Meredith',EnrollmentDate) VALUES (11,'Lopez','Sophia','2004-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (12,'browning','2000-09-01'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (13,'Anand','Arturo',EnrollmentDate) VALUES (14,'Walker','Alexandra',EnrollmentDate) VALUES (15,'Powell','Carson',EnrollmentDate) VALUES (16,'Jai','damien',EnrollmentDate) VALUES (17,'Carlson','Robyn',EnrollmentDate) VALUES (18,'Zheng','2004-02-12',EnrollmentDate) VALUES (19,'Bryant',EnrollmentDate) VALUES (20,'Suarez',EnrollmentDate) VALUES (21,'Holt',EnrollmentDate) VALUES (22,'Alexander',EnrollmentDate) VALUES (23,'Morgan','Isaiah',EnrollmentDate) VALUES (24,'Martin','Randall',EnrollmentDate) VALUES (25,'Kapoor','Candace','2001-01-15',EnrollmentDate) VALUES (26,'Rogers','Cody',EnrollmentDate) VALUES (27,'Serrano','Stacy','1999-06-01',EnrollmentDate) VALUES (28,'White','Anthony',EnrollmentDate) VALUES (29,'Griffin','Rachel',EnrollmentDate) VALUES (30,'Shan','Alicia',EnrollmentDate) VALUES (31,'Stewart','Jasmine','1997-10-12',EnrollmentDate) VALUES (32,'Xu','Kristen','2001-7-23',EnrollmentDate) VALUES (33,'Gao','Erica','2003-01-30'); INSERT INTO dbo.Person (PersonID,EnrollmentDate) VALUES (34,'Van Houten','2000-12-07',null); GO SET IDENTITY_INSERT dbo.Person OFF GO -- Insert data into the Department table. INSERT INTO dbo.Department (DepartmentID,[Name],Budget,StartDate,Administrator) VALUES (1,'Engineering',350000.00,'2007-09-01',2); INSERT INTO dbo.Department (DepartmentID,Administrator) VALUES (2,'English',120000.00,6); INSERT INTO dbo.Department (DepartmentID,Administrator) VALUES (4,'Economics',200000.00,4); INSERT INTO dbo.Department (DepartmentID,Administrator) VALUES (7,'Mathematics',250000.00,3); GO -- Insert data into the Course table. INSERT INTO dbo.Course (CourseID,Title,Credits,DepartmentID) VALUES (1050,'Chemistry',4,1); INSERT INTO dbo.Course (CourseID,DepartmentID) VALUES (1061,'Physics',DepartmentID) VALUES (1045,'Calculus',7); INSERT INTO dbo.Course (CourseID,DepartmentID) VALUES (2030,'Poetry',2,2); INSERT INTO dbo.Course (CourseID,DepartmentID) VALUES (2021,'Composition',3,DepartmentID) VALUES (2042,'Literature',DepartmentID) VALUES (4022,'Microeconomics',4); INSERT INTO dbo.Course (CourseID,DepartmentID) VALUES (4041,'Macroeconomics',DepartmentID) VALUES (4061,'Quantitative',DepartmentID) VALUES (3141,'Trigonometry',7); GO -- Insert data into the OnlineCourse table. INSERT INTO dbo.OnlineCourse (CourseID,URL) VALUES (2030,'http://www.fineartschool.net/Poetry'); INSERT INTO dbo.OnlineCourse (CourseID,URL) VALUES (2021,'http://www.fineartschool.net/Composition'); INSERT INTO dbo.OnlineCourse (CourseID,URL) VALUES (4041,'http://www.fineartschool.net/Macroeconomics'); INSERT INTO dbo.OnlineCourse (CourseID,URL) VALUES (3141,'http://www.fineartschool.net/Trigonometry'); --Insert data into OnsiteCourse table. INSERT INTO dbo.OnsiteCourse (CourseID,Location,Days,[Time]) VALUES (1050,'123 Smith','MTWH','11:30'); INSERT INTO dbo.OnsiteCourse (CourseID,[Time]) VALUES (1061,'234 Smith','TWHF','13:15'); INSERT INTO dbo.OnsiteCourse (CourseID,[Time]) VALUES (1045,'121 Smith','MWHF','15:30'); INSERT INTO dbo.OnsiteCourse (CourseID,[Time]) VALUES (4061,'22 Williams','TH','11:15'); INSERT INTO dbo.OnsiteCourse (CourseID,[Time]) VALUES (2042,'225 Adams','11:00'); INSERT INTO dbo.OnsiteCourse (CourseID,[Time]) VALUES (4022,'23 Williams','MWF','9:00'); -- Insert data into the CourseInstructor table. INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (1050,1); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (1061,31); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (1045,5); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (2030,4); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (2021,27); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (2042,25); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (4022,18); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (4041,32); INSERT INTO dbo.CourseInstructor(CourseID,PersonID) VALUES (4061,34); GO --Insert data into the OfficeAssignment table. INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (1,'17 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (4,'29 Adams'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (5,'37 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (18,'143 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (25,'57 Adams'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (27,'271 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (31,'131 Smith'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (32,'203 Williams'); INSERT INTO dbo.OfficeAssignment(InstructorID,Location) VALUES (34,'213 Smith'); -- Insert data into the StudentGrade table. INSERT INTO dbo.StudentGrade (CourseID,StudentID,Grade) VALUES (2021,4); INSERT INTO dbo.StudentGrade (CourseID,Grade) VALUES (2030,3.5); INSERT INTO dbo.StudentGrade (CourseID,3); INSERT INTO dbo.StudentGrade (CourseID,6,2.5); INSERT INTO dbo.StudentGrade (CourseID,Grade) VALUES (2042,7,8,Grade) VALUES (4041,9,10,null); INSERT INTO dbo.StudentGrade (CourseID,11,12,Grade) VALUES (4061,Grade) VALUES (4022,14,13,15,16,2); INSERT INTO dbo.StudentGrade (CourseID,17,19,20,21,22,23,Grade) VALUES (1045,1.5); INSERT INTO dbo.StudentGrade (CourseID,Grade) VALUES (1061,24,25,Grade) VALUES (1050,26,27,28,29,30,4); GO
3:RIA之ADO.NET ENTITY DATA MODEL
为web创建ADO.NET ENTITY DATA MODEL,如图:
注意,习惯命名规则:Model数据库名.edmx。
在下一步中,我们选择刚才创建的数据库:
选择新建连接,按照指示完成数据库连接配置。
进入下一步:
在这一步中,注意一定要选择第一个红框中的内容,否则默认不能生成联表查询。在下一步中,我们选择“Generate from database”,如下:
点击Finish后,VS为我们生成了一个以edmx为后缀的文件。OK,到此暂停,我们先来看看这个edmx文件是干什么用的,为我们完成了什么工作。
3.1:什么是EDM
ENTITY DATA MODEL,简写为EDM,中文为实体数据模型。它由三个概念组成。概念模型由概念架构定义语言文件 (.csdl)来定义,映射由映射规范语言文件 (.msl),存储模型(又称逻辑模型)由存储架构定义语言文件 (.ssdl)来定义。这三者合在一起就是EDM模型。EDM模型在项目中的表现形式就是扩展名为.edmx的文件。
Entity Framework实现了一套类似于ADO.NET2.0中的连接类来操作EDM完成持久化。EntityFramework中所有发往EDM的操作都是经过EntityClient,包括使用LINQ to Entity进行的操作。目前可用操作如下:
4:针对web EMD的测试
理解了EMD在开发中所处的作用,我们就可以针对EDM来写个测试项目。为了简便期间,我们直接在EMD中的SchoolEntities类型的构造方法中直接创建测试(严格意义来说,这不是个单元测试,这仅是测试)。
针对这个操作,会在测试项目中生成一个SchoolEntitiesTest的类型,同时,在这个类型中会生成一个SchoolEntitiesConstructorTest的方法,如下:
由于我们仅仅测试EDM,而跟WEB本身没有关系,所有我们注释掉了红框中的内容。同时我们写入真正的测试代码,如下:
这里的一个小细节是,连接字符串我们通过编码的方式传入到测试方法。EDM的连接字符串和ADO.NET的连接字符串有很大不同,在这里,可公开一下我们的生成EDM连接字符串的方法:
public string GetConnectionString() { string providerName = "System.Data.sqlClient"; string serverName = "192.168.0.96"; string databaseName = "mysample"; sqlConnectionStringBuilder sqlBuilder = new sqlConnectionStringBuilder(); sqlBuilder.DataSource = serverName; sqlBuilder.InitialCatalog = databaseName; sqlBuilder.IntegratedSecurity = false; sqlBuilder.UserID = "sa"; sqlBuilder.Password = "sasa"; string providerString = sqlBuilder.ToString(); EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = providerName; entityBuilder.ProviderConnectionString = providerString; entityBuilder.Provider = providerName; entityBuilder.Metadata = "res://*/Modelmysample.csdl|res://*/Modelmysample.ssdl|res://*/Modelmysample.msl"; return entityBuilder.ToString(); }
通过了以上的阐述,我们了解了EDM的作用,以及如何测试EDM。接下来,我们需要知道如何在SL APP中调用WEB中的EDM。
5:Domain Service Class
在SL APP中调用EDM是通过WEB的Domain Service Class来实现的。简单的说来,它是RIA SERVICE框架中的一个重要内容。
在WEB选择添加新项,选择Domain Service Class,命名,下一步会出现如下界面:
我们可以做出如上勾选。确定后,编译整个解决方法,会发现目前的解决方案结构会变成如下形式:
注意,第一个红框部分,是VS自动为我们在SL APP生成的。它是第二个红框在客户端的对应版本。我们需要将它包含到项目中去。它包含了所有服务端版本类中定义的方法、实体等,而可在客户端直接调用。
6:Ria Service数据流转
好了,经过以上的描述我们知道了:
EDM:直接操作数据库;
Domain Service Class:调用EDM,并把数据接口通过WCF的形式开放给客户端;
*.Web.g.cs:调用Domain Service Class,完成对数据的读取,并最终呈现给UI;
7:最终展示
后台,直接使用*.Web.g.cs中的DomainServiceMySample 加载数据:
public MainPage() { InitializeComponent(); DomainServiceMySample context = new DomainServiceMySample(); context.Load(context.GetEmpQuery()); lb1.ItemsSource = context.emps; }
最后界面显示:
8:问题
该示例演示了使用Entity Framework和WCF Ria Services进行Silverlight开发。我们当然可以继续使用此模式完善功能,知道一个功能复杂的应用程序开发完毕。但是,当前,此示例起码存在如下几个问题。
1:实体模型被紧耦合在EDM中,同时它不能项目(模块)使用。随着每一次更新EDM,实体模型会被覆盖;
2:EDM和BLL紧耦合在一起;
3:没有提炼出数据接口,导致我们没有办法在此示例中进行单元测试。示例中虽然存在测试项目,但那是数据库相关的,达不到单元测试的要求;
下篇我们将继续重构该示例,以逐步解决这些问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。