使用祖先和路径的GCP DataStore实体

时间:2018-06-21 10:11:06

标签: c# google-cloud-platform google-cloud-datastore

帖子问题是here

我使用的库是Google Cloud Libraries for .NET

现在我只使用单个实体就没有问题,但是在尝试通过检索实体的标识时遇到了另一个问题。

问题在下面列出:

  1. 如何使用库插入带有祖先的实体?

  2. 使用祖先插入实体后,如何获取插入的实体的身份?

  3. 如何使用PathElement

我的英语能力很差,所以请不要介意,因为我对文档没有完全理解。

如果有不当之处或描述不正确,请告诉我。

任何事情都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

要创建带有祖先的实体,只需确保提供的键具有该祖先即可。如果您乐于指定新路径元素的名称部分,创建新键的最简单方法是调用祖先键上的Key.WithElement,但要使用新的路径元素。

如果您想生成密钥,此刻会有点困难,因为在Key上没有像WithElement那样的方法来创建具有不完整的final元素的新密钥。不过,您可以轻松编写自己的扩展方法。

当您插入实体时,将通过Insert方法返回插入的键。这是一个完整的示例,首先创建一个“书架”实体,然后创建三个“书”实体作为其子实体:

  • 在密钥中具有指定名称的人
  • 一个带有不完整密钥的密钥,以便服务器填写由扩展方法创建的ID
  • 一个带有KeyFactory生成的不完整密钥的密钥,以证明该选项。

代码:

using Google.Cloud.Datastore.V1;
using System;
using static Google.Cloud.Datastore.V1.Key.Types;

static class KeyExtensions
{
    // Useful extension method to create an incomplete "child" key
    public static Key WithIncompleteElement(this Key key, string kind)
    {
        Key ret = key.Clone();
        ret.Path.Add(new PathElement { Kind = kind });
        return ret;
    }
}

class Program
{
    static void Main(string[] args)
    {
        string projectId = "YOUR-PROJECT-ID-HERE";
        DatastoreDb client = DatastoreDb.Create(projectId);

        Entity shelf = new Entity
        {
            Key = client.CreateKeyFactory("shelf").CreateIncompleteKey(),
            ["genre"] = "fiction"
        };
        Key shelfKey = client.Insert(shelf);

        // Insert a book specifying a complete key
        Entity book1 = new Entity
        {
            Key = shelfKey.WithElement("book", "potter1"),
            ["title"] = "Harry Potter and the Philosopher's Stone"
        };
        Key book1Key = client.Insert(book1);

        // Insert a book by creating an incomplete key with the extension method
        Entity book2 = new Entity
        {
            Key = shelfKey.WithIncompleteElement("book"),
            ["title"] = "Harry Potter and the Chamber of Secrets"
        };
        Key book2Key = client.Insert(book2);
        Console.WriteLine($"Inserted key: {book2Key}");

        // Insert a book by creating an incomplete key with a KeyFactory
        KeyFactory keyFactory = new KeyFactory(shelf, "book");
        Entity book3 = new Entity
        {
            Key = keyFactory.CreateIncompleteKey(),
            ["title"] = "Harry Potter and the Prisoner of Azkaban"
        };
        Key book3Key = client.Insert(book3);
        Console.WriteLine($"Inserted key: {book3Key}");    
        Console.WriteLine();

        // List all the books    
        var books = client.RunQuery(new Query { Kind = { new KindExpression { Name = "book" } } });
        Console.WriteLine("All books:");
        foreach (var book in books.Entities)
        {
            Console.WriteLine($"{(string) book["title"]}: Key={book.Key}");
        }
    }
}