Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化MongoDB中的聚合根ID_C#_Json_Mongodb - Fatal编程技术网

C# 反序列化MongoDB中的聚合根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)

我试图在MongoDB中为我的聚合根实现一个存储库层。当我从商店检索实体时,我无法完全反序列化它们。一般来说,这些实体没有默认构造函数,并使用GUID作为其实体ID。ID字段为
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; }