使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型

使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型,第1张

概述本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。 Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。使用它可以快速构建自己的开发模式。 1:基础结构 首先,创建SL APP,如下: 然后,选择创建web: 可以,也可以不勾选enable wcf ria service,如果勾选了,

本文目的是通过Silverlight ria service完成一次数据的读取过程,并且在此基础上建立测试项目。

Ria service借助于WCF和ADO.NET Entity Framework构建分布式开发框架。使用它可以快速构建自己的开发模式。

1:基础结构

首先,创建SL APP,如下:

然后,选择创建web:

可以,也可以不勾选enable wcf ria service,如果勾选了,在SL APP中会多几个DLL的引用,其它没有任何差别。如图:

2:创建一个示例数据库

这是一个小而轻型的数据库,在mdsN的课程中有使用到它。如下:

SET ANSI_NulLS ONGOSET QUOTED_IDENTIFIER ONGOUSE [master];GOIF 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;GOUSE 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'))BEGINCREATE 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]ENDGO-- Create the Person table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[Person]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO-- Create the OnsiteCourse table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[OnsiteCourse]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO-- Create the OnlineCourse table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[OnlineCourse]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO--Create the StudentGrade table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[StudentGrade]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO-- Create the CourseInstructor table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[CourseInstructor]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO-- Create the Course table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[Course]') 		AND type in (N'U'))BEGINCREATE 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]ENDGO-- Create the OfficeAssignment table.IF NOT EXISTS (SELECT * FROM sys.objects 		WHERE object_ID = OBJECT_ID(N'[dbo].[OfficeAssignment]')		AND type in (N'U'))BEGINCREATE table [dbo].[OfficeAssignment](	[InstructorID] [int] NOT NulL,1652953136 [timestamp] NOT NulL,CONSTRAINT [PK_OfficeAssignment] PRIMARY KEY CLUSTERED (	[InstructorID] ASC)WITH (IGnorE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]ENDGO-- 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])GOALTER 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])GOALTER 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])GOALTER 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])GOALTER 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])GOALTER 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])GOALTER 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])GOALTER 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])GOALTER 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'))BEGINEXEC 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 1652953136 FROM OfficeAssignment 				WHERE InstructorID=@InstructorID;		END' ENDGO--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'))BEGINEXEC 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 1652953136=@OrigTimestamp;		IF @@ROWCOUNT > 0		BEGIN			SELECT 1652953136 FROM OfficeAssignment 				WHERE InstructorID=@InstructorID;		END' ENDGO-- 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'))BEGINEXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DeleteOfficeAssignment]		@InstructorID int		AS		DELETE FROM OfficeAssignment		WHERE InstructorID=@InstructorID;' ENDGO-- 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'))BEGINEXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DeletePerson]		@PersonID int		AS		DELETE FROM Person WHERE PersonID = @PersonID;' ENDGO-- 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'))BEGINEXEC 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;' ENDGO-- 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'))BEGINEXEC 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;' ENDGO-- 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'))BEGINEXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[GetStudentGrades]            @StudentID int            AS            SELECT EnrollmentID,Grade,CourseID,StudentID FROM dbo.StudentGrade            WHERE StudentID = @StudentID' ENDGO-- 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'))BEGINEXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[GetDepartmentname]      @ID int,@name nvarchar(50) OUTPUT      AS      SELECT @name = name FROM Department      WHERE DepartmentID = @ID'ENDGO-- Insert data into the Person table.USE SchoolGOSET IDENTITY_INSERT dbo.Person ONGOINSERT 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);GOSET IDENTITY_INSERT dbo.Person OFFGO-- 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();        }

调试我们的测试代码,最终我们会获取到数据库中的4条记录。

@L_403_11@

通过了以上的阐述,我们了解了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:最终展示

在SL APP中的UI调用呈现数据。前台:

后台,直接使用*.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:没有提炼出数据接口,导致我们没有办法在此示例中进行单元测试。示例中虽然存在测试项目,但那是数据库相关的,达不到单元测试的要求;

下篇我们将继续重构该示例,以逐步解决这些问题。

本示例源码下载:SilverlightApplicationSchool20110612.zip

总结

以上是内存溢出为你收集整理的使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型全部内容,希望文章能够帮你解决使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1016235.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存