使用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的便利之处

相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
685 10
|
11月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
519 23
|
12月前
|
网络协议 C#
基于.NET WinForm开发的一款硬件及协议通讯工具
基于.NET WinForm开发的一款硬件及协议通讯工具
143 7
|
前端开发 Android开发
WinForm 直接运行 Admin.NET
本文介绍了如何将 Admin.NET 以 WinForm 桌面程序模式运行,简化了手动配置 Web 服务的过程,便于演示和作为单机软件使用。通过添加特定 NuGet 包、修改 `Program.cs` 和 `Form1.cs` 文件,并调整项目配置,最终实现了在 WinForm 中嵌入 WebView 组件显示 Admin.NET 界面的效果。
183 0
WinForm 直接运行 Admin.NET
|
开发框架 监控 .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
253 5
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
489 2
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
712 6
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
数据库 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 应用中集成这两种技术,提高开发效率。
397 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一

热门文章

最新文章