跨多个回发存储对象的方法

asp.net entity-framework postback

为了论证,假设我有一个允许用户编辑订单详细信息的webform。用户可以执行以下功能:

  • 更改运费/付款详情(所有简单文字/下拉菜单)
  • 按顺序添加/删除/编辑产品 - 这是通过网格完成的
  • 添加/删除附件

产品和附件存储在单独的DB表中,并带有订单的外键。

实体框架(4.0)用作ORM。

我想允许用户对订单进行任何他们想要的更改,并且只有当他们点击“保存”时我才想将更改提交到数据库。这不是文本框/复选框等问题,因为我可以依赖ViewState来获取所需信息。然而,网格对我来说是一个更大的问题,因为我无法找到一种简单明了的方法来持久保存用户所做的更改,而无需将更改提交给数据库。在Session / ViewState中存储Order对象树实际上并不是我想要的选项,因为对象可能变得非常大。

所以问题是 - 我怎样才能保留用户在准备好“保存”之前所做的更改。

快速注意 - 我搜索过SO试图找到一个解决方案,但是我发现所有的建议都是使用Session和/或ViewState - 由于我的对象树的潜在大小,我不想使用这两个

一般承认的答案

如果使用Session不是您首选的解决方案,这可能是明智的,最好的解决方案是创建自己的临时数据库表(或者像其他人提到的那样,在现有数据库表中添加临时标志)并在那里保存数据,在Session(或cookie)中存储单个标识符以供以后检索。


专家解答

你认为大到多大?如果你正在谈论会话状态 (所以它不会回到实际用户,比如视图状态),那么状态通常是一个非常好的选择。除了中状态提供商都使用序列,但你可以影响它是如何序列化。例如,我会倾向于创建一个代表只是我关心(以及任何ID / rowversion信息),该操作(而不是全域实体,其中可能有额外的开销)状态的局部模型。

为了进一步减少序列化开销,我会考虑使用protobuf-net之类的东西;这可以用作ISerializable的实现,允许非常轻量级的序列化对象(通常比BinaryFormatterXmlSerializer等小得多),在页面请求时重建很便宜。

最后保存页面时,我会从本地模型更新我的域实体并提交更改。

有关信息,要使用状态序列化器(通常为BinaryFormatter )的protobuf-net属性对象,您可以使用:

// a simple, sessions-state friendly light-weight UI model object
[ProtoContract]
public class MyType {
    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public string Name {get;set;}

    [ProtoMember(3)]
    public double Value {get;set;}
    // etc

    void ISerializable.GetObjectData(
        SerializationInfo info,StreamingContext context)
    {
        Serializer.Serialize(info, this);
    }

    public MyType() {} // default constructor

    protected MyType(SerializationInfo info, StreamingContext context)
    {
        Serializer.Merge(info, this);
    }
}



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因