在Cassandra C#驱动中使用私有字段及值对象映射问题
Cassandra实体映射解决方案
1. 值对象(VO)与数据库原始类型的映射
你的UserId值对象已定义与Guid的隐式转换,在Cassandra映射中可通过ConvertUsing方法处理对象与数据库类型的双向转换:
internal sealed class UserMappings : Mappings { public UserMappings() { For<User>().TableName("users") .PartitionKey(x => x.Id) // 注意:同一字段无需同时设为分区键和聚类键,保留其一即可 .Column(x => x.Id, x => x.WithDbType<Guid>() .WithName("id") .ConvertUsing(vo => (Guid)vo, dbValue => (UserId)dbValue)) // 密码哈希字段映射 .Field(x => x._passwordHash, x => x.WithName("password_hash")); } }
2. 私有字段的映射
对于User类中的私有字段_passwordHash,直接使用映射配置的Field方法绑定即可,驱动会通过反射访问私有成员:
.Field(x => x._passwordHash, x => x.WithName("password_hash"))
若驱动无法识别表达式形式的私有字段,也可直接指定字段名字符串:
.Field("_passwordHash", x => x.WithName("password_hash"))
3. 无参构造函数的要求
不需要公共无参构造函数,但必须存在一个无参构造函数(私有、内部或保护级别均可)。Cassandra驱动反序列化实体时会通过反射调用无参构造函数创建实例,你当前User类中的私有无参构造函数已满足要求,无需修改。
内容的提问来源于stack exchange,提问作者Adrian Franczak
相关产品推荐
相关产品推荐

