【问题标题】:Using private fields with the Cassandra C# driver在 Cassandra C# 驱动程序中使用私有字段
【发布时间】:2022-08-08 23:04:18
【问题描述】:

我正在尝试将我的一个模块从 Postgres(使用 EF)迁移到 Cassandra。 这是我对 Cassandra 映射的最佳尝试:

internal sealed class UserMappings : Mappings
{
    public UserMappings()
    {
        For<User>().TableName(\"users\")
            .PartitionKey(x => x.Id)
            .ClusteringKey(x => x.Id)
            .Column(x => x.Id, x => x.WithDbType<Guid>().WithName(\"id\"))
// I want to add mappings for password Hash here

    }
}

第一个问题是我使用 VO 来确保安全,但想将原语存储在数据库中。 实体 id 的示例 VO:

public record UserId
{
    public Guid Value { get; }

    public UserId(Guid value)
    {
        if (value == Guid.Empty) throw new Exception(\"Invalid UserId\");
        Value = value;
    }
    
    public static implicit operator Guid(UserId id) => id.Value;
    public static implicit operator UserId(Guid id) => new(id);
    
}

其次,我的实体有私有字段,我不知道如何将它们映射到数据库。

internal class User
{
    private User()
    {
    }

    public User(/*...*/)
    {
        //...
    }
    private string _passwordHash;
    public UserId Id { get; }
    
    //...
}

还需要公共无参数构造函数吗?

  • 关于如何提出好问题的友好说明。一般指导是您 (a) 提供问题的良好摘要,包括软件/组件版本、完整的错误消息 + 完整的堆栈跟踪; (b) 描述您尝试解决问题的方法、您所做调查的详细信息; (c) 复制问题的最小示例代码。干杯!
  • 我无法在本地使用您的代码,因此无法重现该问题。没有定义类型 \"Email, \"FirstName\", \"RefreshToken\", \"PasswordHash\" \"InvalidUserIdException\"。如果这些类型不是重现问题所必需的,则不要添加这些字段或只使用原生类型,如字符串和异常。
  • 另外,“我的大部分领域都有 VO”是什么意思,VO 是什么意思?
  • @JoãoReis VO 对我来说是类/记录,其中包含一个属性以避免原始痴迷,并且使用它们更安全,例如,当参数顺序更改时,它不会编译。我将删除我的代码中不必要的部分:)

标签: c# .net cassandra datastax-csharp-driver


【解决方案1】:

听起来您想在用于映射到数据库的类中包含一些业务逻辑。我建议创建仅具有公共属性且没有任何逻辑的新类(即 POCO),然后“手动”或使用 AutoMapper 之类的库将这些对象映射到您的域对象中。这样做的好处是将域对象与数据库模式分开。

DataStax C# 驱动程序映射器将无法映射没有设置器的私有字段或属性。它能够使用private setter 映射属性,因此您可能想要利用它。

另请记住,如果您在映射中使用自定义类型,则需要为MapperTable 对象提供自定义TypeConverter。如果您有隐式运算符来转换这些类型(例如您的 UserId 类),您可能会不实现 TypeConveter 而侥幸,但我不确定 100%。

在构造函数问题上,我认为拥有一个私有的空构造函数就足够了。

【讨论】:

  • 如何为 public Map<TPoco> Column<TPoco> 添加重载,将字符串作为第一个参数以按名称获取字段?
  • 如果您未指定列,驱动程序会自动推断列,即使使用默认行为,它仍然不会在没有设置器的情况下获取私有字段或属性,因为这是设计使然。我们可以允许选择使用您建议的方式映射私有字段,请随时在datastax-oss.atlassian.net/jira/software/c/projects/CSHARP/… 上创建 JIRA,但请记住,这样的事情是低优先级的,可能不会很快被采纳。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 2013-08-30
  • 2017-03-24
  • 1970-01-01
  • 2018-08-03
  • 2014-03-27
  • 2017-03-28
  • 2020-07-14
相关资源
最近更新 更多