使用Ado.net Entity快速建立基于WCF的Winform Silverlight应用

简介: 关键词: WCF, Ado.net Entit, Ado.net Self-Trakcing Entity, silverlight, O/R mapping 概述 [例子代码在http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/OrderServices.zip] Ado.net Entity是微软推出的O/R mapping框架,在Vs2008sp1时是1.0版本,现在和vs2010一起发布的是2.0版本,通过使用发现,2.0版本对于做分层的企业应用比较方便,下面具体的描述一下,供参考。

关键词:

WCF, Ado.net Entit, Ado.net Self-Trakcing Entity, silverlight, O/R mapping

概述

[例子代码在http://cid-56b433ad3d1871e3.office.live.com/self.aspx/.Public/OrderServices.zip]

Ado.net Entity是微软推出的O/R mapping框架,在Vs2008sp1时是1.0版本,现在和vs2010一起发布的是2.0版本,通过使用发现,2.0版本对于做分层的企业应用比较方便,下面具体的描述一下,供参考。

以一个C/S形式的例子说明,数据层直接使用Ado.net Entity建立的对象,在客户端和服务段共享这些结构,这样可以比较快速的构建起来系统,而且由于IDE支持可视化的修改,因此数据模型修改和变化非常的方便。

使用Ado.net Entity作为数据对象在客户端和服务端传递时,如果处理数据的修改和更新问题呢?如Order包含很多个对象Books,而客户端对于Books可以删除、增加、修改操作,这些操作完后,如何更新到服务端,此时可以使用Ado.net Self-Trakcing Entity Generator 自动生成模板, 这个是IDE提供的一个自动跟踪变化的框架,比较方便。

详细步骤如下:

1. 建立项目结构

Models:客户端和服务端共享的数据业务对象

Web:承载WCF的服务

Client: 测试WCF服务和各种接口

clip_image002

2. 添加模型:

OrdersModel.edmx

此处以一个简单的对象包含和继承关系为例说明

clip_image004

注意:

Ø 代码生成策略:注意此处设置为None,默认是自动有的,但这个自动生成的结构由于在客户端和服务端传递后处理更新比较麻烦,因此这样设置,在后续加一个自跟踪的对象处理

Ø 关联关系的设置:为了后续的独立查询方便,把主外键的关系设置一下

clip_image006

Ø 级联删除:如上图的Cascade,这样Order对象删除后,其关联的对象自动也自动删除[如果想自己删除,当然也是没有问题的]

3. 使模型能够自跟踪:

clip_image008

clip_image010

从模型生成数据库:建立数据库联接,执行生成出来的sql脚本即可

clip_image012

最终的模型工程如下:

clip_image014

4. 服务程序

首先引用Models项目和System.Datat.Entity.dll

Ø ObjectContext的生命期:由于默认的ObjectContext是延迟加载的,因此对于关联的对象,如果需要在客户端和服务器端传递,需要明确指定,否则序列化时会出现异常。至于这个的生命期可以参考blog.msdn上的文章。

public static void ContextLazy(Action<OrdersModelContainer> context)

{

using (OrdersModelContainer ctx = new OrdersModelContainer(WebConfigurationManager.ConnectionStrings["OrdersModelContainer"].ConnectionString))

{

ctx.ContextOptions.LazyLoadingEnabled = false;

context(ctx);

}

}

Ø 数据库的增删改查:可以使用linq和objectQuery的方法配合使用。

public class OrderService : IOrderService

{

private static readonly int PageSize = 50;

public void Create(Order order)

{

ObjectContextHelpers.Context(ctx =>

{

ctx.OrderSet.AddObject(order);

ctx.SaveChanges();

});

}

public List<Order> Read(string condition, int pageIndex, out int totals)

{

List<Order> ps = null;

int total = 0;

ObjectContextHelpers.ContextLazy(ctx =>

{

Func<Order, bool> f = (p) =>

{

return p.Name.Contains(condition);

};

total = ctx.OrderSet.Where(f).Count();

ps = ctx.OrderSet.Where(f).OrderByDescending(p => p.Id).Skip(pageIndex * PageSize).Take(PageSize).ToList<Order>();

});

totals = total;

return ps;

}

public Order ReadDetail(int Id)

{

Order order = null;

ObjectContextHelpers.ContextLazy(ctx =>

{

order = ctx.OrderSet.Include("Books").Where(o => o.Id == Id).First();

});

return order;

}

public void Update(Order order)

{

ObjectContextHelpers.Context(ctx =>

{

ctx.OrderSet.ApplyChanges(order);

ctx.SaveChanges();

});

}

public void Delete(int orderId)

{

Order ord = this.ReadDetail(orderId);

ObjectContextHelpers.Context(ctx =>

{

ord.StartTracking();

ord.MarkAsDeleted();

ctx.OrderSet.ApplyChanges(ord);

ctx.SaveChanges();

});

}

public void Clear()

{

ObjectContextHelpers.Context(ctx =>

{

string sql = @"delete from BookSet_IndustryBook;

delete from BookSet_ITBook;

delete from BookSet;

delete from OrderSet;";

ctx.ExecuteStoreCommand(sql);

ctx.SaveChanges();

});

}

}

5. 客户端程序

共享Models对象

clip_image016

private void button1_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

Order o = new Order()

{

Name = "o1",

Books = new TrackableCollection<Book>()

{

new ITBook(){ Name="it", Index ="Computer"},

new IndustryBook(){ Name="it", Summary ="Industry Book"},

}

};

svc.Create(o);

}

}

private void button2_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

int total;

List<Order> orders = svc.Read(out total, "o", 0);

Debug.WriteLine(orders.Count);

}

}

private void button3_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

int total;

List<Order> orders = svc.Read(out total, "o", 0);

Debug.WriteLine(orders[0].Books.Count);

Order o = svc.ReadDetail(orders[0].Id);

Debug.WriteLine(o.Books.Count);

}

}

private void button4_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

int total;

List<Order> orders = svc.Read(out total, "o", 0);

Debug.WriteLine(orders[0].Books.Count);

Order o = svc.ReadDetail(orders[0].Id);

o.Name += "--";

foreach (Book b in o.Books)

{

if (b is ITBook)

{

ITBook it = b as ITBook;

it.Index += "--";

}

else if (b is IndustryBook)

{

IndustryBook ind = b as IndustryBook;

ind.Summary += "--";

}

}

///此ä?处ä|也°2可¨¦以°?删¦?除yBooks的Ì?条¬?目?

o.Books.Add(new ITBook() { Name = "it2", Index = "Computer" });

svc.Update(o);

Order o1 = svc.ReadDetail(orders[0].Id);

Debug.Assert(o1.Name == o.Name && o.Books.Count == o.Books.Count);

}

}

private void button5_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

int total;

List<Order> orders = svc.Read(out total, "o", 0);

Debug.WriteLine(orders[0].Books.Count);

svc.Delete(orders[0].Id);

}

}

private void SqlClr_Click(object sender, EventArgs e)

{

using (OrderServiceClient svc = new OrderServiceClient())

{

svc.Clear();

}

}

6. Silverlight项目的操作

如果在silverlight工程中使用以上的方法,由于Models引用的是.net4框架,那岂不是无法处理。通过Ado.net Self-Trakcing Entity的分析,由于这些类都是基于.net库独立实现的,通过试验确认:这些类可以在silverlight运行时环境下正常使用,具体步骤如下:

Ø 建立Models(sl)的silverlight项目,添加System.Runtime.Serialization.dll引用

Ø 在Models(sl)添加Models中的OrdersModel.tt下的所有文件(注意是Add Link,不要添加物理文件,这样Models更新后,在Models(sl)自动更新;如果模型新加入或删除了对象后,同样的方法处理一下即可)

clip_image018

SilverlightApplication应用引用Models(sl),添加WCF服务引用后,即可以享用实体框架和Ado.net Self-Trakcing Entity的便利之处

相关文章
|
4月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
185 10
|
2月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
2月前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
133 2
|
4月前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
178 6
|
5月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
79 0
|
5月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
87 0
|
5月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
56 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
80 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
120 0