1

我目前正在开发一个以asp.net mvc4和mongodb为数据库的网站。由于 Microsoft Membership Provider 只支持 SQL-DB,我必须使用另一个 Membership Provider。我决定使用 ExtendedMongoMembership Provider。只要我在创建帐户期间没有传递其他用户属性,一切都会正常工作。当我尝试添加一些额外的属性(如电子邮件)时,CreateUserRow 函数的功能会抛出异常。我已经下载了源代码并尝试修复它。因此,我必须在对象内部分离对象,这似乎是必要数据传递给函数的方式。

 public bool CreateUserRow(string userName, IDictionary<string, object> values)
    {
        string userTableName = "Users";
        List<BsonElement> elements = new List<BsonElement>();
        elements.Add(new BsonElement("UserName", userName));
        elements.Add(new BsonElement("_id", GetNextSequence("user_id")));
        if (values != null)
        {
           // Here I'm facing the problem where I have to get the property names
           // and the values to add them to the elements list
           // The IDictionary is unfortunately not build in the way
           // propertyname,value so that I could get the entries in an easy way

        }

        var collection = _provider.GetCollection(userTableName);
        var result = collection.Insert(new BsonDocument(elements.ToArray()));
        return result.LastErrorMessage == null;
    }

IDictonary 包含 4 个名为 (Comparer,Count,Keys,Values) 的键,键名及其计数是固定的。用于写入数据库的属性名称存储为对象内的单个对象,该对象是字典内具有键“Keys”的值。这同样适用于 db 的值,这些值也存储在一个对象中,该对象是一个带有键“Values”的值。我的问题是我不知道如何分离这些对象。这是一张显示调试会话期间字典结构的图片。

http://i.stack.imgur.com/h4z7I.jpg 如何访问存储为值的对象内部的对象?

编辑:现在找到了一种方法,还有更好的方法吗?

        var propnames = ((IEnumerable<object>) values["Keys"]).ToArray();
        var propvalues = ((IEnumerable<object>)values["Values"]).ToArray();
        dynamic test;
        for (int i = 0; i < propnames.Count(); i++)
        {
            Type type = propvalues[i].GetType();

            test = Convert.ChangeType(propvalues[i], type.UnderlyingSystemType);
            //BsonValue bsonValue = test as BsonValue;
            elements.Add(new BsonElement(propnames[i] as string,test ));
        }
4

0 回答 0