0

我正在使用 Azure 表存储,并且对实体的空值和默认值如何工作有疑问。

具体来说,我有一个扩展类TableServiceEntity。此类的默认构造函数为各种属性设置默认值,如下所示:

public class MyEntity: TableServiceEntry
{
    public MyEntity() : MyEntity("invalid", "invalid") {}
    public MyEntity(string f1, string f2) 
    {
        Field1 = f1;
        Field2 = f2;
    }

    public string Field1 { get; set; }
    public string Field2 { get; set; }
 }

我通过构建以下实体在本地(在模拟器上)测试了这个类:

MyEntity e = new MyEntity("hello", null);

我上传了实体,然后在本地检索它,这两个字段分别设置为“hello”和 null,正如预期的那样。

但是,当我将同一个实体上传到 Azure 云时,我收到的回复分别是两个属性的“hello”和“invalid”。

我保存实体的代码如下:

public class MyTable : TableServiceContext
{
    ...
    public void AddEntry(MyEntity e)
    {
        this.AddObject("MyTable", e);
        this.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate);
    }
}

我可以通过使默认构造函数不带参数来解决这个问题,但现在我觉得我对表存储的工作原理有一个基本的误解。当您为 TableServiceEntry 的属性指定默认值时,这些属性是否会成为云中表中每一行的默认值,而不是在模拟器中(即云与 SQL Express)?如果是这样,为什么我不能null在云中覆盖这些默认值?是否有任何文档解释默认构造函数和nulls 如何在 Azure 表存储中工作?

4

2 回答 2

1

是的,表存储在模拟器和云中的行为方式有所不同。SQL Server 中实现的模拟器返回为表定义的所有列,即使没有为行定义,与列值(空/非空)无关。在云中,设置为 null 的属性既不会存储也不会在 REST 调用中返回。

一个快速的解决方法是检查属性集中的空值,并且仅在传入的值不为空时才改变属性。

于 2012-08-09T18:44:15.457 回答
0

在某些情况下,Devstorage 和实际存储的行为不同,但我从未见过它们以不同的方式处理 NULL 值。而且我当然从未见过它将值从 NULL 更改为“无效”,正如您所暗示的那样。您确定您没有不小心将错误的值上传到云端吗?您可能想再试一次,并使用 Fiddler 查看实际的请求和响应值。

于 2012-08-09T19:24:30.590 回答