4

我想将这样的实体用于表存储:

public class MyEntity
{
    public String Text { get; private set; }
    public Int32 SomeValue { get; private set; }

    public MyEntity(String text, Int32 someValue)
    {
        Text = text;
        SomeValue = someValue;
    }
}

但这是不可能的,因为 ATS 需要

  1. 无参数构造函数
  2. 所有属性都是公开的和读/写的。
  3. 继承自 TableServiceEntity;

前两个,是我不想做的两件事。为什么我希望任何人都可以更改一些应该是只读的数据?或以不一致的方式创建此类对象(那么 .ctor 的用途是什么?),或者更糟糕的是,更改 PartitionKey 或 RowKey。为什么我们仍然受到这些反序列化要求的限制?

我不喜欢以这种方式开发软件,如何以可以序列化和反序列化自己的对象的方式使用表存储库?我认为只要对象从 TableServiceEntity 继承就应该不是问题。

到目前为止,我必须保存一个对象,但我不知道如何检索它:

            Message m = new Message("message XXXXXXXXXXXXX");

            CloudTableClient tableClient = account.CreateCloudTableClient();
            tableClient.CreateTableIfNotExist("Messages");
            TableServiceContext tcontext = new TableServiceContext(account.TableEndpoint.AbsoluteUri, account.Credentials);

            var list = tableClient.ListTables().ToArray();

            tcontext.AddObject("Messages", m);
            tcontext.SaveChanges();

有没有办法避免那些反序列化要求或获取原始对象?

干杯。

4

5 回答 5

5

如果您想使用存储客户端库,那么是的,您可以和不能对您要存储的对象执行哪些操作是有限制的。第1点是正确的。我将第 2 点扩展为“您要存储的所有属性都必须是公共的并且是读/写的”(对于整数属性,您可以摆脱只读属性并且它不会尝试保存它们)但是您不'实际上不必继承自TableServiceEntity.

TableServiceEntity只是一个非常轻量级的类,它具有 PartitionKey、RowKey、Timestamp 属性,并用DataServiceKey属性进行修饰(看看 Reflector)。您可以对自己创建的类执行所有这些操作,而不是从 TableServiceEntity 继承(请注意,这些属性的大小写很重要)。

如果这仍然不能让您对如何构建类有足够的控制权,您总是可以忽略存储客户端库并直接使用REST API。这将使您能够以任何您喜欢的方式对 XML 进行序列化和反序列化。您将失去使用该库带来的所有好处,例如在 LINQ 中创建查询的能力。

于 2011-02-13T19:59:28.180 回答
4

围绕表存储的 ADO.NET 包装器的约束确实有些痛苦。您还可以采用Lokad.Cloud中实施的胖实体方法。这将为您的实体序列化提供更大的灵活性。

于 2011-02-14T14:06:01.500 回答
2

只是不要使用继承。

如果您想使用自己的 POCO,请根据需要创建您的类,并创建一个单独的 tableEntity 包装器/容器类,该类包含 pK 和 rK 并将您的类作为序列化字节数组携带。

于 2011-02-14T01:11:00.927 回答
1

您可以使用合成来实现您想要的。根据需要创建表实体以进行存储,并将 POCO 创建为那些提供您希望其余应用程序代码看到的 API 的包装器。您甚至可以混合一些接口以获得更好的代码。

于 2011-06-09T23:23:50.817 回答
1

如何使用 System.Reflection.Emit 在运行时生成 POCO 包装器http://blog.kloud.com.au/2012/09/30/a-better-dynamic-tableserviceentity/

于 2012-10-01T12:10:07.653 回答