簡體   English   中英

在 .NET 中使用 DynamoDB 持久化子類

[英]Persisting sub-classes with DynamoDB in .NET

我有一個類層次結構,我希望使用 DynamoDB 的 .NET 對象持久性模型(V2 條目轉換)保留它。 我想將派生類持久化到與基類相同的表中,然后能夠查詢該表中的所有條目並將它們反序列化為適當的派生類型。

在大多數 ORM 中,您將能夠指定一個類型鑒別器列,它將用於決定反序列化為哪個子類型。

代碼示例:

public abstract class Animal
{
    [DynamoDBHashKey]
    public string Name { get; set; }
}

[DynamoDBTable("Animal")]
public sealed class Dog : Animal
{
    public double Loyalty { get; set; }
}

[DynamoDBTable("Animal")]
public sealed class Cat : Animal
{
    public int MiceEaten { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var client = new AmazonDynamoDBClient(RegionEndpoint.EUWest1);
        using (var context = new DynamoDBContext(client, new DynamoDBContextConfig {Conversion = DynamoDBEntryConversion.V2}))
        {
            context.Save(new Dog { Name = "Rover", Loyalty = 0.8 });
            context.Save(new Cat { Name = "Felix", MiceEaten = 14 });

            var doggie = context.Load<Animal>("Rover");
            var pussy = context.Load<Animal>("Felix");

            Console.WriteLine(doggie.GetType().Name); // should output Dog
            Console.WriteLine(pussy.GetType().Name); // should output Cat
        }
    }
}

預期輸出將是:

Dog
Cat

但實際上崩潰了,但有以下異常:

Unhandled Exception: System.InvalidOperationException: 
Type ConsoleApplication1.Animal is unsupported, it cannot be instantiated

有沒有一種很好的方法來持久化這個類層次結構? 如果需要,我可以對類模型進行更改,我只是想讓它感覺像慣用的 C#。

我還嘗試了放置 DynamoDBTable 屬性的各種組合,包括僅用於 Animal 和所有三個類。 如果我從 Animal 中刪除抽象,它不會拋出異常,而是輸出 Animal Animal,因此不會反序列化特定於派生類的屬性。

我現在遇到了同樣的問題。 據我所知,DynamoDB 沒有為將行數據從單個表映射到不同的 C# 類提供一流的支持。

GitHub aws-sdk-net存儲庫 ( #245 ) 中發布了一個問題,該問題展示了如何使用類型鑒別器方法將表行反序列化為不同的 C# 類。 這就是我要開始調查的內容……如果成功,我會在這里更新我的答案。

更新 #1 :不幸的是,將 DynamoDB 數據反序列化為適當的子類類型的唯一方法似乎是類型映射——也就是說,構建一組類型檢查,將您的 DynamoDB 轉換為匹配的具體類型。

如果你讀到這里的文件- http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DeclarativeTagsList.html ,你會發現從DynamoDbTable屬性的描述如下:

DynamoDBTable屬性可以被繼承。 在前面的示例中,如果添加了一個從開發人員類繼承的新類Lead,則它也會映射到People表。 Developer和Lead對象都存儲在People表中。

DynamoDBTable屬性也可以被覆蓋。 在下面的C#代碼示例中,Manager類是從Developer類繼承的,但是顯式添加DynamoDBTable屬性會將該類映射到另一個表(Managers)。

因此,您可以將DynamoDBTable屬性添加到Animal並從子類中刪除。 或添加到Animal並將DynamoDBTable添加到具有其他名稱的子類中,具體取決於您的目標。

暫無
暫無

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

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