C# 反序列化MongoDB中的聚合根ID
我试图在MongoDB中为我的聚合根实现一个存储库层。当我从商店检索实体时,我无法完全反序列化它们。一般来说,这些实体没有默认构造函数,并使用GUID作为其实体ID。ID字段为C# 反序列化MongoDB中的聚合根ID,c#,json,mongodb,C#,Json,Mongodb,我试图在MongoDB中为我的聚合根实现一个存储库层。当我从商店检索实体时,我无法完全反序列化它们。一般来说,这些实体没有默认构造函数,并使用GUID作为其实体ID。ID字段为ID // Example Aggregate Root public class MyAggregateRoot : Entity<Guid> { // New Constructor public MyAggregateRoot(string someInitialState)
ID
// Example Aggregate Root
public class MyAggregateRoot : Entity<Guid> {
// New Constructor
public MyAggregateRoot(string someInitialState)
: base(Guid.NewGuid()) { }
// Reinitializing Constructor
public MyAggregateRoot(Guid id, string someInitialState)
: base(id) { }
}
public abstract class Entity<T> {
protected Entity(T id) {
Id = id;
}
public T Id { get; }
}
我知道Mongo能够将正确的ID与ID
关联,因为以下lambda:
collections.Find(a=>a.Id==Id.ToList()
但它似乎并没有连接到最后的点时,值得。有什么方法可以实现我想要的吗?问题是Mongo序列化程序无法处理具有
专用只读设置程序的属性。当反序列化一个对象时,is只是使用这些字段的默认值
一旦我将Entity
上的Id
属性更改为使用private
setter,值就被正确序列化了
public abstract class Entity<T> {
protected Entity(T id) {
Id = id;
}
public T Id { get; private set; }
}
公共抽象类实体{
受保护实体(T id){
Id=Id;
}
公共T Id{get;私有集;}
}
问题在于Mongo序列化程序无法处理具有专用只读设置程序的属性。当反序列化一个对象时,is只是使用这些字段的默认值
一旦我将Entity
上的Id
属性更改为使用private
setter,值就被正确序列化了
public abstract class Entity<T> {
protected Entity(T id) {
Id = id;
}
public T Id { get; private set; }
}
公共抽象类实体{
受保护实体(T id){
Id=Id;
}
公共T Id{get;私有集;}
}
虽然您自己的答案是正确的,Mongo无法处理readonly属性,但根本原因有点不同
get
只有属性根本没有setter。取而代之的是
public T Id { get; }
protected Entity(T id) { Id = id; }
相当于以下C#6之前的代码
其中,编译器自动将对属性的引用替换为对构造函数中字段的引用
所以问题是MongoDB找不到任何属性设置器,因为没有设置器。虽然您自己的答案是正确的,Mongo无法处理只读属性,但根本原因有点不同
get
只有属性根本没有setter。取而代之的是
public T Id { get; }
protected Entity(T id) { Id = id; }
相当于以下C#6之前的代码
其中,编译器自动将对属性的引用替换为对构造函数中字段的引用
所以问题是MongoDB找不到属性的任何setter,因为没有
private readonly T _id;
public T Id { get { return _id; } }
protected Entity(T id) { _id = id; }