我正在开发一个Web表单,其中包含一个包含4个步骤的向导:
在每一步我都会创建从数据库生成的新实体。
问题在于,作为一个wizzard,用户可以更改将生成要存储的值的控件的属性。
所以我需要释放创建的实体对象或将该实体值返回到存储在数据库中的原始行。
我该怎么办呢。
如果我将每个创建的实体对象设置为null,那么它应该可行吗?
顺便说一句,这就是我的方式:
entities = new Entities();
...
Client client = new Client();
client.name = tbxName.text
...
entities.SaveChanges();
entities.Connection.Close();
所以如果这个代码是在3部分向导的第2个向导部分上执行的,那么我回过头来通过这个设置更多,一旦客户端创建运行不止一次,所以这就是我的问题。
那我怎么能解开它:-P
Thannks !!!
答案 0 :(得分:4)
如果您正在构建向导,则必须将其作为单个操作进行管理。这意味着您必须在会话中存储构建的实体图并仅在完成并确认完整向导时保存它。您的步骤逻辑还必须检查实体图中是否已存在相关数据并使用它们而不是创建新数据。
答案 1 :(得分:0)
如果您使用实体框架,为什么不实施工作单元模式?向导的每个部分都构建了UoW,“最后一步”提交了工作单元。
几年前MSDN杂志上有一篇名为“The Unit Of Work Pattern And Persistence Ignorance”的文章解释了这个概念。
答案 2 :(得分:0)
这就是我这样做的方式:
1-创建一个可以管理会话变量的地方:
public class SessionObjects { }
2-我在Session中保存了ObjectContext,所以我创建了一个属性来管理它在上面提到的类中:
public static ObjectContextEntities ObjectContextEntities
{
get
{
return (ObjectContextEntities)HttpContext.Current.Session["ObjectContextEntities"];
}
set
{
HttpContext.Current.Session["ObjectContextEntities"] = value;
}
}
3-在向导的开始处初始化ObjectContext并将其置于其末尾:
void StartWizard()
{
SessionObject.ObjectContextEntities = new ObjectContextEntities();
}
void StartWizard()
{
SessionObject.ObjectContextEntities = new ObjectContextEntities();
}
void EndWizard()
{
((ObjectContextEntities)SessionObject.ObjectContextEntities).Dispose();
}
4-要将向导结果保存到数据库,您可以调用:
void SaveWizard()
{
((ObjectContextEntities)SessionObject.ObjectContextEntities).SaveAllChanges();
}
5-要重置向导,只需调用EndWizard,然后调用StartWizard。
我想你知道如何管理你的ObjectEntity对象和ObjectContext,这样你就可以自己从这里继续......