【发布时间】:2014-08-17 19:52:30
【问题描述】:
这可能已经被问和回答了 1000 次,但今天早上 Google 还不是我的朋友。
我正在从使用存储过程和业务对象切换到使用实体框架。我喜欢从生成的 EDM 生成 POCO 的简单性(此处为数据库优先方法)。而且我喜欢打字少得多。
我很难为一个非常常见的应用场景(无论如何,在我的世界中)设计一个合适的设计。
基本上,想象一个数据输入应用程序,假设是一个在线商店的管理员(我在 WPF 中做这件事,但它很容易基于 Web)。
管理员希望在数据网格中查看客户列表(管理客户视图)。对于每一行,都有一个按钮来编辑客户或删除它。在网格的底部有一个用于创建新客户的按钮。
如果他们删除客户,则会立即从数据网格以及后端数据存储中将其删除(确认后)。如果他们编辑客户,则会弹出一个窗口(编辑客户视图),显示该客户的当前数据。他们可以编辑数据,然后单击提交或取消。提交将更改保存到数据存储中,取消则放弃更改。两个按钮都会关闭窗口。
如果他们从 Manage Customer 视图中单击 New Customer 按钮,则会创建一个新的 Customer 对象(尚未保存到 DB),并打开相同的 Edit Customer 视图,显示新的空白客户。
这是我到目前为止所得到的:
当构建管理客户视图模型时,它会填充客户的公共列表,例如:
public List<Customer> customers {get; set; }
using (WebStoreEndities context = new WebStoreEntities())
{
customers = context.Customers.ToList();
}
然后,如果管理员用户单击 Customer 行中的 Edit 按钮,则绑定的 Customer 对象将传递给 Edit Customer 视图的构造函数。该视图构造其视图模型,该模型具有视图绑定到的客户属性。用户可以在视图中对 Customer 对象进行更改,然后单击保存或取消。
这是我迷路的地方。在我的业务对象/存储过程实现中,我将只有两个客户对象:一个用于正在编辑的客户(绑定到视图),以及该客户的一个副本,称为 backupCustomer,用于在它们取消更改时恢复更改编辑客户视图(因为我使用的是 MVVM,所以客户的属性会立即从 UI 中更改,如果他们开始进行更改,然后单击取消,他们将不会在该客户中看到他们的更改)。
更重要的是,如果他们确实在 Edit Customer 视图中单击了 Submit,则会调用 Customer 业务对象的 Save() 方法,该方法进入 DAL 并触发存储过程以更新数据存储。
好的,现在进入实体框架现实。
问题 #1。无法保存单个实体。因此,即使我将 Customer 实体扩展为具有 Save() 方法,它也必须创建一个新的 WebStoreEntities 上下文并在其上调用 SaveChanges():
using (WebStoreEntities context = new WebStoreEntities())
{
context.SaveChanges();
}
这对我来说似乎很奇怪。我认为您不希望有一个实体实例来创建实体上下文和东西。
问题 #2。在我的业务对象实现中,我缓存了我的对象,因此我只需要从数据库中获取它们一次。如果他们对客户进行更改,那就太好了。我只是在上面调用 save() 并更新数据存储。与删除和插入相同。但是我永远不必多次获取相同的客户集合(并发性不是这个特定项目的问题)。在我的 EF 实现中,每次他们打开“管理客户”视图时,都会触发上面的代码以获取客户列表。我想我可以只在整个应用程序期间保持一个数据上下文打开,但这似乎也是一个糟糕的设计。为整个用户会话绑定数据存储的连接,因为他们可能会多次打开同一个视图。
请帮我解决以上问题,如果可以的话,不要挂断我要说的话(反正这只是我的初步印象):
似乎 EF 在我的关注点分离中混淆了逻辑边界:
- 您必须在 UI 项目中保留实体连接字符串的副本(我通常将业务对象和数据对象保存在单独的项目中)。
- 您不能告诉实体保存或删除自己。您必须从底层上下文中执行此操作,这通常位于 UI 层中。在我的 UI 中,我喜欢能够说 myBusinessObject.Save() 或 myBusinessObject.Delete(),因为我知道对象知道如何保存或删除自己。
无论如何,EF 似乎是未来,所以我会坚持下去。我会喜欢你的建议。
非常感谢!
放克猴子。
【问题讨论】:
-
查看存储库和工作单元模式以使用 EF。 codeproject.com/Articles/688929/Repository-Pattern-and-Unit-of
标签: c# wpf entity-framework