4

我目前正在工作中启动一个新的 ASP.NET MVC 项目,我们需要生成项目成本估算。

我们正在使用 NHibernate、ASP.NET MVC 1.0 和 StructureMap。

客户希望能够填写有关项目的所有信息,这些信息位于不同的页面中,我们需要在每次回发之间坚持。

客户端不希望在完成时选择以名称保存它,但我们希望即使他还没有保存它,也希望将它持久保存在数据库中。所以我们有了创建“草稿模式”的想法,这样用户将开始处理他的项目,将填满所有页面,并在“草稿模式”开启的情况下将其持久化在数据库中。

但是我们需要管理草稿,我的意思是,当用户开始编辑现有项目时,我们需要创建它的副本,将对象及其所有子对象设置为草稿模式,并在我们的数据库中创建它的副本. 我们将需要更改子项的所有引用。

所以,我试图找到深度复制对象并更改所有引用的最佳方法,我宁愿不必为我必须复制的每个实体创建一个复制类,如果这是更通用的东西可能的。

如果您需要更多详细信息或不清楚的地方,请告诉我。

谢谢,

查尔斯

4

4 回答 4

8

我会尝试让我的域解决这个问题,让 NHibernate 只保存数据而不是复制它。我将创建一个定义 DeepCopy() 方法的 IDeepCopy 接口。然后在这些方法中的每一个中,您将创建一个新对象并自己复制值并控制您希望如何正确处理子对象或父对象。

于 2010-02-21T04:34:42.573 回答
1

我使用这个功能:

    public static T DeepClone<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;

            return (T)formatter.Deserialize(ms);
        }
    }
于 2011-06-29T08:15:13.473 回答
1

我建议为您的项目使用SharpArchitecture。它将为您节省大量时间和金钱。
没有简单的方法来进行数据的深层复制,因为它非常特定于一个案例。因此,您必须手动创建所有副本。
我还建议为草稿实体使用不同的表格,而不是草稿实体。在这种情况下,IMO 会更容易实现,并且不会违反SRP。正如人们所说,分而治之。

于 2010-02-19T23:11:56.237 回答
1

这可能是个坏主意,我不确定它是否会起作用,但是如果您只是简单地浏览对象图并将所有必需的 id 设置为默认的未保存值,然后让级联保存完成将所有引用拼凑在一起的工作,该怎么办?在数据库中。

于 2010-02-19T22:15:13.380 回答