我目前正在开发一个使用asp.net mvc4和mongodb作为数据库的网站。由于Microsoft成员资格提供程序仅支持SQL-DB,因此我将使用其他成员资格提供程序。我决定使用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)的键,键名及其计数是固定的。写入db的属性名称存储为对象内部的单个对象,该对象是Dictonary中具有键“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 ));
}