1

有没有更好的方法来编写 UDTMaps 与使用 Cassandra 数据库和 C# 驱动程序的表相同

假设 Cassandra 数据库中有一个名为 Users(Id, name text, Address freeze ) 的表。现在将其映射到 C# 的表中,我可以编写如下

public class AppMappings : Mappings
    {
        public AppMappings()
        {
              For<User>()
               .TableName("Users")
               .Column(u => u.Id, cm => cm.WithName("userId"))
               .Column(u => u.Name, cm => cm.WithName("username"))
               .Column(u => u.AddressDetails , cm => cm.WithName("address"))
               .PartitionKey(u=> u.Id);
        }
    }

public class User 
{
   public Guid Id {get;set;}
   public string Name {get;set;}
   public Address AddressDetails {get;set;}
}

public class Address {
   public string State {get;set;}
   public string City {get;set;}
}

现在我可以使用 Single Class AppMappings 应用任何配置,它可以有许多与表的映射。有了这一行,我可以初始化所有映射

MappingConfiguration.Global.Define<AppMappings>();

但是要应用 UDT 我需要手动添加以下行。

session.UserDefinedTypes.Define(UdtMap.For<Address>("address_udt"));

假设我有 10/20 个 UDT,那么我需要为每个 UDT 添加这一行。相反,有什么方法可以在一个地方添加 UDT 映射,比如映射?还是添加 UDT 映射的更好方法?

4

1 回答 1

3

不幸的是,驱动程序没有用于 UDT 映射的实用程序,但您可以创建类似的东西:

public abstract class CustomUdtMappings
{
    private readonly IDictionary<Type, UdtMap> _definitions = new Dictionary<Type, UdtMap>();

    public UdtMap[] Definitions => _definitions.Values.ToArray();

    public UdtMap<TPoco> For<TPoco>(string udtName = null, string keyspace = null) where TPoco : new()
    {
        if (_definitions.TryGetValue(typeof(TPoco), out var map) == false)
        {
            map = UdtMap.For<TPoco>(udtName, keyspace);
            _definitions.Add(typeof(TPoco), map);
        }

        return (UdtMap<TPoco>) map;
    }
}

然后创建包含 udt 映射的映射类:

public class MyAppUdtMappings : CustomUdtMappings
{
    public MyAppUdtMappings()
    {
        For<Udt1>("udt1")
            .Map(udt => udt.Id, "iid")
            .Map(udt => udt.Column1, "aasd");

        For<Udt2>("udt2")
            .Map(udt => udt.Id, "iiid")
            .Map(udt => udt.Column1, "aaasd");
    }
}

你可以这样使用它:

await session.UserDefinedTypes.DefineAsync(new MyAppUdtMappings().Definitions).ConfigureAwait(false);

我认为向驱动程序添加这样的东西很有意义,所以我创建了https://datastax-oss.atlassian.net/browse/CSHARP-897来跟踪它。

于 2020-04-20T13:21:32.787 回答