我有一个类层次结构,我想与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,因此不会反序列化特定于派生类的属性。

最佳答案

如果您在此处阅读文档-http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DeclarativeTagsList.html,则可以从DynamoDbTable属性的描述中找到以下内容:


  DynamoDBTable属性可以被继承。在前面
  例如,如果您添加一个新类Lead,它继承自
  开发人员类,它也映射到People表。既是开发者
  和Lead对象存储在People表中。
  
  DynamoDBTable属性也可以被覆盖。在下面的
  C#代码示例,Manager类继承自Developer类,
  但是,DynamoDBTable属性的显式添加映射了
  类到另一个表(经理)。


因此,您可以将DynamoDBTable属性添加到Animal并从子类中删除。或添加到Animal并将DynamoDBTable添加到具有其他名称的子类中,具体取决于您的目标。

关于c# - 在.NET中使用DynamoDB保留子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32508095/

10-11 09:03