我目前正在开发一个以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 ));
}