2

我正在开发一个带有 Linq to SQL 数据库上下文的 ASP.NET 动态数据网站,我有一个问题。在我的一个表 ARReports 中,存在一个包含原始 XML 数据的列,我可以将其反序列化为 ReportDetails 对象,以及其他数据,例如 EditedBy、ReleaseDate 和其他字段。

ReportDetails 有几个公共属性,我想在我的自定义 Edit.aspx 页面上公开它们。

我的目标是:当用户导航到 Edit.aspx 页面时,我希望他们能够编辑 ARReports 行和 ReportDetails 的公共属性,所有这些都是原始类型。然后当它们更新时:将 ReportDetails 对象序列化回 XML 并更新表中的该字段。

无论如何我可以说,在 ReportDetails 类型的 ARReport 类(Linq to SQL 类)中创建一个属性,并将该类脚手架放入 Edit.aspx 页面?也许看起来像这样:

public partial class ARReport
{
    private ReportDetails _details;

    public ReportDetails Details
    {
         get
         {
             if (_details == null)
                  _details = ReportDetails.DeSerialize(this.RawXML);
             return _details;
         }
         set
         {
             this.RawXML = ReportDetails.Serialize(_details);
         }
}

public class ReportDetails
{
     public String Owner {get; set;}
     public DateTime LastEdit {get; set;}
     //...etc...

     public static String Serialize(ReportDetails report)
     {
          // serialization code
     }

     public static ReportDetails DeSerialize(String rawXML)
     {
         // deserialization code
     }
}

我希望有一些属性和/或技巧的组合可以应用于类和属性以实现我正在寻找的东西,但到目前为止,严格的谷歌搜索还没有提出任何解决方案。我希望这不会太混乱。我感谢任何帮助或见解。

4

1 回答 1

3

这是可以做到的。考虑将 ReportDetails 的属性保留在 L2S 数据上下文的 OUT 中(因为它在您的数据库中没有明确地作为一列)。

我的建议是为报告详细信息构建一个自定义字段模板。使用 UIHintAttribute 在编辑/详细信息页面上正确引用该字段模板。在填充控件之前,将报告详细信息反序列化为 POCO 并照常填写控件。

至于序列化,在数据上下文中覆盖 SubmitChanges 事件,检查 ARReport 的更新,更改属性值,然后提交更改:

public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
    ChangeSet changeset = GetChangeSet();
    foreach (var change in changeset.Updates.OfType<ARReport>())
    {
        // serialize ReportDetails here before submitting changes. 
    }   
    try
    {
        base.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException cce)
    {
        // handle this
    }
}
于 2012-07-05T23:20:01.793 回答