65.9K
CodeProject 正在变化。 阅读更多。
Home

ComponentOne for Entity Framework–让我惊喜

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (3投票s)

2012 年 8 月 7 日

CPOL

5分钟阅读

viewsIcon

12749

ComponentOne Studio for Entity Framework 体验分享。

前段时间我收到一封邮件,询问是否有熟悉 Entity Framework 的人来评审一款 Entity Framework 工具。我想,为什么不呢,因为去年我曾在 Dallas TechFest 上遇到过 ComponentOne 的一些人,当时他们是赞助商。结果发现是 ComponentOne Studio for Entity Framework。

开箱即用 – 初印象

这个工具相当不错,但真正让我印象深刻的是它的示例。感觉就像走进厨房,发现晚餐已经做了一半。这些示例是上手工具的好方法。

clip_image001[3]

这些示例提供了详细的介绍,然后直接打开一个 Visual Studio 解决方案供你开始动手。作为一个代码爱好者,这对我来说是一个很大的加分项。

解决方案中的引用… 我的天

我对一些事情比较挑剔,而一大堆引用通常是其中之一,所以在这方面我必须给 ComponentOne 的人扣分。我的 WPF 项目需要引入 4 个引用才能正常运行 clip_image002[3]。我知道这对大多数人来说没什么大不了,但要求一个基础引用是不是有点过分?(好了,我不再抱怨了。)更现实地说(也不再抱怨了),需要多个引用是有原因的。不同的平台/技术需要不同的引用链。如果你只需要 LiveLinq 的强大功能,就不需要整个框架,这很好。我想我必须接受,世界并不总是符合我理想中的样子。

clip_image003[3]

代码中 – 简单而强大

一旦进入代码,我发现了几个引起我兴趣的、与我平时使用 LINQ 不同的地方:AsDynamic 和 AsLive。这两部分似乎解决了我在用少量代码完成某些任务时遇到的一个难题。

我通常将我的 Grid 等控件绑定到一个 ViewModel,该 ViewModel 在底层持有 observable collections,然后手动将修改写入一个 queryable。这在很多时候似乎是多余的。这就是它们派上用场的地方。AsLive 直接从我的 lambda 语句中提供了一个 IObservableCollection。我觉得这很棒,但 AsDynamic 更进一步,它可以在一个匿名投影上进行操作。唯一的限制是它必须在 EntityCollection 或 ICollection 上使用,这意味着我们必须确保返回 ICollections。如果我们返回 EntityCollection,在架构上成本太高。还有一点,“嘿,下面隐藏着一个很酷的功能。”

clip_image004[3]

你注意到 ADO 和 XML 扩展了吗?从 DataTable 或 XDoc/XElement 中获得 IObservable!?太棒了。

事务、UI 和回滚 – 不可能,开玩笑?!

这让我大吃一惊!看看这个。

// All changes in this window are made in the scope of this client transaction.   
ClientTransaction _transaction;  

public OrderWindow(Order order, ClientTransaction transaction)   
{    
InitializeComponent();    
_transaction = transaction; 

// Create a proxy for the order that automatically opens the transaction scope   
// each time a value is assigned to a property; and use it for data binding.    
DataContext = transaction.ScopeDataContext(order);  

// Define a live view of order details.   
var orderDetailsView = from od in order.Order_Details.AsLive()    
select new OrderDetailsInfo    
{    
OrderID = od.OrderID,    
ProductID = od.ProductID,    
UnitPrice = od.UnitPrice,    
Discount = od.Discount,    
Quantity = od.Quantity    
};    
// All changes in this view are made in the transaction scope.    
orderDetailsView.SetTransaction(_transaction);    
orderDetailsGrid.ItemsSource = orderDetailsView;    
}

没错,这简直是完美的胜利,还带着一点超赞![LL1] 过去 9 个月我一直在开发一个高度事务性的应用程序,这个功能可以节省 SOOOO 的时间。我唯一担心的是,如果同时与 WCF 或其他数据库通信,你需要设置 DTC,但对于这种客户端事务,你本来就需要这样做。这个功能加上集成的撤销/回滚功能,让 UI 编程的痛苦减少了很多。

// Initialize the client transaction.   
// Specify that all changes to _ordersView are automatically considered changes made in the scope of this transaction.    
_transaction = _cache.CreateTransaction();    
_ordersView.SetTransaction(_transaction);

// Enable/disable the Undo button when the _transaction.HasChanges property value changes.   
_transaction.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(transaction_PropertyChanged);    
buttonUndo.IsEnabled = false;

if (_transaction.HasChanges)   
{    
// Ask the user whether they will save or cancel the changes made by this control.    
switch (MessageBox.Show("Do you want to save changes?", "", MessageBoxButton.YesNoCancel, MessageBoxImage.Question))    
{    
case MessageBoxResult.Yes:    
_transaction.Commit();    
break;    
case MessageBoxResult.No:    
_transaction.Rollback();    
break;    
case MessageBoxResult.Cancel:    
return;    
}    
}    
// Raise the CloseRequested event, so MainWindow removes the tab page with this control.    
CloseRequested(this, EventArgs.Empty);    
}

客户端缓存 – 尚不确定

在使用 ComponentOne Studio for Entity Framework 工具时,我看到的大部分内容都使用了他们标记为“智能客户端缓存”的功能。这个功能在概念和实践上都很棒,但在你想要在正常的缓存模式之外工作时,它似乎会变得有点棘手。这只是额外的代码,你需要管理它来以一种有针对性的方式绕过缓存(例如,在不清除整个缓存的情况下刷新单个缓存对象)。

虚拟模式 – 实现得当的“低垂的果实”的艺术

虚拟模式是一种享受。实现“低垂的果实”总是让我高兴,但这个更好。最近几个月,我不得不到处实现分页和异步滚动,因为我们的用户想要大量数据,同时又要求响应速度。ComponentOne 在这方面做得非常出色。虚拟模式是一个简单的布尔属性,可以在滚动时启用异步数据加载!再也不用自己实现异步分页了!

这只是……太棒了。

总体概述 – 这里有很多很棒的东西

我可能有点偏颇,因为过去 9 个月我一直在处理一个相当复杂的 WPF UI,但这个东西太棒了。我不是控件套件的忠实粉丝,这就是为什么我回避他们的控件,只关注代码。他们提供控件,但我认为最大的收获在于 LiveLINQ 库和他们的 WPF 扩展。这可以为我现在的客户节省数周的时间。UI 集成简单、直接,并且完美地处理了事务。我不得不说,我一开始是相当怀疑的,但当我深入代码时,ComponentOne 已经消除了许多在集成 Entity Framework 和 UI 时产生的冗余痛苦。

我遇到的唯一缺点是,我一直在开发的 Highway.Data Framework 集成得不太好。我必须回去看看是否能让集成更容易一些,因为我两者都想要。

享受编码吧,并看看 ComponentOne Studio for Entity Framework

披露材料联系:我收到了上述一种或多种产品或服务,以希望能在我的博客上提及。无论如何,我只推荐我个人使用并相信我的读者会喜欢的产品或服务。我在此披露,以符合美国联邦贸易委员会的《联邦法规大全》第 16 部分,第 255 条:“关于在广告中使用认可和推荐的指南”。

更新 – 2012 年 7 月 30 日 – 修正了一些错误,比如产品名称 *哎呀*

© . All rights reserved.