1

假设我有一些数据形式为

Customer1
 Name
 Address
 Order1
  ID
  Products
   Product1
    ID
   Product2
    ID
Customer2
 ...

使用下面的类来表示它

class Customer
{
 public String name { get; set; }
 public String Address {get; set;}
 public List<OrderInfo> Orders { get; set; }
} 

class Order
{
 public int ID { get; set; }
 public List<Product> Products { get; set; }
}

class Product
{
 public int ID { get; set; }
}

我想使用 XML 序列化来读取/写入数据,而不是使用实体框架和 SQL。使用实体框架,我可以定义多对一关系,这样每个产品只会在数据库中存储一次,每个订单只会引用它。将上述代码与 XML 序列化一起使用,据我了解,每个产品都会存储许多副本(在内存和 XML 文件中)。

为了解决这个问题,我可以只存储产品 ID 列表而不是产品本身,然后将单独的“产品”集合序列化到另一个 XML 文件中——但这并不是一个干净的解决方案。

另一个想法是有一个包含客户和产品列表的 RepositoryClass。然后,客户只需要存储 productID,当您从 repo 请求“客户”时,它会处理查找和构建上述对象,因此我的其余代码不必担心数据是如何存储的. 这听起来像是一个更好的解决方案吗?你会怎么做?

解决方案的另一个要求是,我希望尽可能轻松地将解决方案连接到 GUI 以直接编辑属性(这实际上就是为什么我希望有一种方法可以将它全部存储在一个我可以绑定到的 XML 文件中WPF 窗口)。

提前感谢您的想法和建议!

4

2 回答 2

1

内存中不会存储任何副本,因为您可以实例化特定产品一次并从那时起引用该产品。

xml 的情况稍微复杂一些。xml 规范确实为此提供了解决方案,但我不确定 .NET 框架对此的支持程度。你可以有一个这样的 xml 文档:

<rootElement>
    <Customers>
        <Customer ...>
            <Order>
                <ProductRef ref="1" />
                <ProductRef ref="2" />
            </Order>
        </Customer>
    </Customers>
    <Products>
        <Product id="1" />
        <Product id="2" />
        <Product id="3" />
        <Product id="4" />
    </Products>
</rootElement>

如果您指定需要此功能的 DTD 或 XML 模式,验证 XML 解析器将验证id' 在文档中是唯一的,并且每个ref属性实际上都引用了。id

当然,您仍然需要构建一些东西来解析这个结构,但您不再有重复的 xml 数据。

于 2010-10-25T18:30:44.870 回答
0

.NET 中的 DataContractDeserializer 有一个名为 preserveObjectReferences 的构造函数参数。如果此参数设置为 true(默认为 false),则保留对象的身份。更多信息:http: //msdn.microsoft.com/en-us/library/ms731073.aspx

于 2012-02-19T15:27:03.737 回答