2

密接に関連するいくつかの質問があるので、この質問の下にグループ化しています。

C# と mongoDB ドライバーとデータベースを使用して、オブジェクト モデルの永続的なデータベースを作成しようとしています。すべてのユーザー オブジェクトを保存できるようにしたい - それらのユーザー内にはセッション (「リスト」または同様のデータ構造) があり、各セッションには、作成したさまざまなイベントとレコード (リストも含む) があります。新しいリクエストが行われると、最初は識別子でユーザーを検索します。存在する場合は、セッション オブジェクトを作成します。そのセッション オブジェクトをユーザーのセッション リストに追加し、適切な更新を行います (イベントまたはレコードをセッションに追加します)。(それ以外の場合は、新しいユーザーを作成します-データベースに追加してから、前の手順を実行します)

私の問題は、エラーが発生した場合、"collection.save(user)"または"find(user)"エラーが発生した場合、抽象クラスをシリアル化できないことです。ドキュメントによると、「自動マッピング」機能を使用できるはずなので、そのまま使用できると思いました。それは素晴らしいことです。db オブジェクトを、UsersDb クラスにあるように、ユーザー オブジェクトの単なるコンテナーとして表示したいと考えています。

そうでない場合 - 使用できる適切な「mongodb」コンテナ クラスはありますか (つまり、「List<Session>" use ->の代わりにBsonList<Session>)」? また、クラス内でコンテナをインスタンス化するにはどうすればよいですか? それらがシリアライザーによって生成された場合、コンストラクターでそれらを開始する必要がありますか? また、クラスに任意の「動的」データを保存するにはどうすればよいですか (通常の json のみ)。

次のような基本的なコレクションを作成しています。

public class UsersDb 
{
    public UsersDb()
    {
        MongoServerSettings settings =new MongoServerSettings();
        settings.Server = new MongoServerAddress("localhost",27017);
        MongoServer server = new MongoServer(settings);
        MongoDatabase db = server.GetDatabase("defaultDb");
        Users = db.GetCollection<User>("Users");
        //Users.Drop();
    }

    public MongoCollection<User> Users { get; set; }        
}

これが私のユーザークラスです:コンストラクターがセッションリストを作成できる必要があるため、すでにここに問題があります-しかし、mongoドライバーによってシリアル化された場合はどうなりますか?

public User()
{
    SessionComparer uc = new SessionComparer();
    Sessions = new List<Session>();;
}

public ObjectId Id { get; set; }
public string Udid { get; set; }
public DateTime EnrollDate { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public List<Session> Sessions { get; set; }

私のセッションクラス

public class Session
{
    public Session()
    {
        Events = new List<Event>();
        Records = new List<Record>();
    }
    public string SessionId { get; set; }
    public DateTime Time { get; set; }
    public dynamic Parameters { get; set; }
    public IList<Event> Events { get; set; }
    public IList<Record> Records { get; set; }
}

記録

public class Record
{
    public Record()
    {
        RecordId = Guid.NewGuid().ToString();
        CreatedAt = DateTime.Now;
    }
    public string Name { get; set; }
    public string RecordId { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime Time { get; set; }
    public dynamic Data { get; set; }
}

そしてイベント

public class Record
{
    public Record()
    {
        RecordId = Guid.NewGuid().ToString();
        CreatedAt = DateTime.Now;
    }
    public string Name { get; set; }
    public string RecordId { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime Time { get; set; }
    public dynamic Data { get; set; }
}
4

1 に答える 1

0

動的に逆シリアル化することはできません。実際のクラスを使用するには、より厳密なものが必要です。

おそらく、次の回避策が適している可能性があります。

[BsonKNownTypes(typeof(Implementation1))]
[BsonKNownTypes(typeof(Implementation2))]
public class DynamicModelHere {}
public class Implementation1 : DynamicModelHere { property, property, property }
public class Implementation2 : DynamicModelHere { property, property, property }
于 2016-04-21T19:15:20.877 に答える