簡體   English   中英

AWS Dynamodb..NET Core LoadAsync 不使用輔助鍵作為搜索鍵

[英]AWS Dynamodb ..NET Core LoadAsync doesnt use secondary key as search key

我們正在使用帶有 .net 內核的 DynamoDb 並實現 facebook 登錄。 通常,我們在數據庫中使用 uuid 作為用戶 ID,但使用 facebook 登錄,我想將 facebook 用戶 ID 保存為輔助鍵,以便能夠使用 Z26CAE7718C32180A407A0F8E19D 加載項目。

當用戶使用 facebook 登錄時,我將用戶的 FacebookToken 字段設置為常規字段。但是,我無法使用該索引加載用戶..

return await _context.LoadAsync<DbDynamoUser>(playerId,new DynamoDBOperationConfig { IndexName = "FacebookToken" });

DynamoDbTable

[DynamoDBTable("Users")]

public class DbDynamoUser 
{
    [DynamoDBHashKey]
    public string Id { get; set; }
    

    [DynamoDBGlobalSecondaryIndexHashKey]
    public string FacebookToken { get; set; }


    [DynamoDBProperty(typeof(DynamoDbUserConverter))]
    public LocalUser User { get; set; }

    public UserLogs Logs { get; set; }
    public string AuthenticationMethod { get; set; }
    public string LastDeviceUuid { get; set; }
}

即使我指定 IndexName,LoadAsync 也會使用主鍵作為搜索鍵。

動態數據庫索引

我只是偶然發現了同樣的問題。 我不明白為什么LoadAsync沒有使用我的全局二級索引。 我不斷收到InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Guid'. (我的 Id 屬性配置為 Guid 類型)。

在四處尋找之后,我發現了這個答案: https://stackoverflow.com/a/43733229 ,它為我指明了正確的方向。

如該答案中所述,您可以對 GSI 索引執行掃描或查詢操作,但不能對 GetItem(在我們的示例中為 LoadAsync)操作執行。

對於表中的每個項目,它們必須具有唯一的 Hash 和 Range 鍵,但對於 GSI,Hash 和 Range 鍵不是唯一的,它們可能包含重復的項目。

LoadAsync切換:

return await _context.LoadAsync<User>(emailAddress);

QueryAsync然后解決了我的問題:

var search = _context.QueryAsync<User>(emailAddress, new DynamoDBOperationConfig { IndexName = nameof(User.EmailAddress) });
var firstSet = await search.GetNextSetAsync();

if (firstSet.Count > 1)
    throw new Exception($"Duplicate email address found \"{emailAddress}\"");
if (firstSet.Count == 0)
    throw new Exception($"User with email address \"{emailAddress}\" was not found");

return firstSet[0];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM