Azure 移动服务 C#:如何 return 完全继承实体而不仅仅是祖先的字段

Azure Mobile Services C#: how to return full inherited entity and not only the fields of the ancestor

我几乎没有继承自共同祖先的实体。

public class Ancestor : EntityData {
 public string AncestorType { get; set; } //kind of enum
}

public class DescendantA : Ancestor {
 public string DescendantAProp { get; set; }
}

public class DescendantB : Ancestor {
 public int DescendantBProp { get; set; }
}

我创建了一个控制器 AncestorController 来在一次调用中检索所有实体,而无需为 DescendantADescendantB 等多次复制相同的调用

搭建的控制器如下所示:

public class AncestorController : TableController<Ancestor>
{
...

  public IQueryable<Ancestor> GetAllAncestor()
  {
    return Query(); 
  }

...
}

不幸的是,方法 GetAllAncestor() returns 只有具有 Ancestor 字段的元素,而不是 DescendantA and/or DescendantB 字段的元素.

例如返回示例 JSON:

[
    {
        "deleted": false,
        "updatedAt": "2018-01-23T00:05:52.3Z",
        "createdAt": "2018-01-23T00:05:52.3Z",
        "version": "AAAAAAAAB9Q=",
        "id": "07434aaa-c51a-425a-aca4-90bfb9a06a54",
        "ancestorType": "DescendantA"
    },
    {
        "deleted": false,
        "updatedAt": "2018-01-24T23:00:20.907Z",
        "createdAt": "2018-01-24T23:00:20.692Z",
        "version": "AAAAAAAAJ2U=",
        "id": "08f89ee7-ca78-46ea-9b6a-ef23bda3299b",
        "ancestorType": "DescendantB"
    }
]

虽然我想看:

[
    {
        "deleted": false,
        "updatedAt": "2018-01-23T00:05:52.3Z",
        "createdAt": "2018-01-23T00:05:52.3Z",
        "version": "AAAAAAAAB9Q=",
        "id": "07434aaa-c51a-425a-aca4-90bfb9a06a54",
        "ancestorType": "DescendantA",
        "DescendantAProp": "SomeValueA"
    },
    {
        "deleted": false,
        "updatedAt": "2018-01-24T23:00:20.907Z",
        "createdAt": "2018-01-24T23:00:20.692Z",
        "version": "AAAAAAAAJ2U=",
        "id": "08f89ee7-ca78-46ea-9b6a-ef23bda3299b",
        "ancestorType": "DescendantB",
        "DescendantBProp": "SomeValueB"
    }
]

我应该怎么做才能达到这样的目标?

谢谢!!!

cghersi

public class AncestorController : TableController

根据你定义的TableControllerAncestorControllerGetAllAncestor方法返回的结果,我假设你在MobileServiceContextDbContext下定义了如下DbSet:

public DbSet<Ancestor> Ancestors { get; set; }

根据您的代码,您定义了一个名为 Ancestors 的 SQL 数据库 table,它只包含来自 EntityDataAncestorType 您定义的列。

I created a controller AncestorController to retrieve all the entities in a single call, without the need to replicate the same call several time for DescendantA, DescendantB, etc.

据我了解,DescendantADescendantB 代表每个数据库 table,您需要独立定义您的 TableController 并且针对每个 table 端点发送请求以检索记录。

public class DescendantAController : TableController<DescendantA>
{
   //TODO:
}

public class DescendantBController : TableController<DescendantB>
{
   //TODO:
}

此外,您还可以创建一个新操作或覆盖 TableController 提供的现有内置操作,并将所有后代 table 记录合并到一个操作中,但您可能无法利用某些功能 (例如离线同步、OData 查询等)。

您可以使用来自 SQL 的视图,它会为您提供此结果

创建视图组合 作为 开始 Select * 来自 DescendantB UNION Select * 来自 DescendantA 结束

然后在 Table 控制器中使用 View 而不是 table

public class CombineController : TableController<Combine>
{
 ...

  public IQueryable<Combine> GetAllAncestor()
  {
return Query(); 
 }

... 
 }