这可能是软件设计或模式问题。
使用LINQ to SQL的C#Wnforms解决方案。 有一个表单允许用户编辑Customer对象的属性值。
如果用户想要创建新客户,则表单将传递给新客户。
如果用户想要编辑现有客户,则表单将传递给现有客户。
当用户尝试关闭表单时,会检查是否需要保存对属性值的编辑,并提示用户保存更改:
protected Boolean CanExit()
{
Boolean isSaveNeeded = false;
String message = String.Empty;
if (dataContext.GetChangeSet().Updates.Contains(lookupObject))
{
message = "Save your changes before closing?";
isSaveNeeded = true;
}
else if (dataContext.GetChangeSet().Inserts.Contains(lookupObject))
{
message = String.Format("Save new {0} before closing?", lookupSingularName);
isSaveNeeded = true;
}
if (isSaveNeeded && XtraMessageBox.Show(message, "Close Form", MessageBoxButtons.YesNo, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{ return ActionSave(); }
else
{ return true; }
}
这有两个问题:
提示保存未设置属性的新客户。
如果用户编辑了属性值,则提示保存,然后将值更改回原始值
我有一个使用ADO' Original Values解决这两个问题的模式。
使用DataContext解决问题的最佳方法是什么?
答案 0 :(得分:0)
你可以使用Memento设计模式轻松解决它(这样你可以比较对象 - 编辑之前和之后)
你可以在这里查看维基详细信息。
https://en.wikipedia.org/wiki/Memento_pattern
可以查看纪念品上的文章。
http://www.codeproject.com/Articles/186184/Memento-Design-Pattern
答案 1 :(得分:0)
您的客户对象应该实现IEquatable。
在操作员开始编辑现有客户之前,请记住原始客户。在CanExit中,使用编辑的数据创建一个Customer对象,并与原始客户进行比较,以查看是否有更改,因此必须保存。这将解决在进行某些更改并进行更改后的问题。
如果创建了新客户,则原始客户为空。
current
答案 2 :(得分:0)
如何确定新创建的对象是否具有用户设置的任何属性值
一件可能的事情是:
在进行任何更改之前制作对象的临时副本。
如果需要保存(用户按保存按钮或尝试关闭编辑窗口),那么我们应该验证他填写表格的数据。如果此数据包含一些无效值,那么我们需要提醒用户并让他再次编辑数据。验证数据后,应将其与初始数据进行比较,如果不同,则必须保存。
以下内容:
class Customer
{
//...... your logic
public static bool operator ==(Customer x, Customer y)
{
return true; // add your logic for comparison here
}
public static bool operator !=(Customer x, Customer y)
{
return false; // add your logic for comparison here
}
}
让myCustomer成为你添加/编辑的对象
Customer temp = null;
if(myCustomer != null) temp = new Customer() { Id = myCustomer.Id, Name = myCustomer.Name ......... }
// add some logic to return user into edit form until it has valid values
while(!ValidateForm(myCustomer)) myCustomer = UIEditCustomer();
if(temp == null || myCustomer != temp) PromptToSave();
答案 3 :(得分:0)
我解决了这个问题 - 不使用Linq to SQL
替换为ORM(DevExpress XPO发生)
ORM使OO开发变得更加容易