public MongoDbDataStore(MongoDatabase db, string collectionName) { _db = db; _collection = db.GetCollection <T>(collectionName); _memberResolver = new EntityMemberResolver <T>(); if (this.AutoConfig && !BsonClassMap.IsClassMapRegistered(typeof(T))) { BsonClassMap.RegisterClassMap <T>(cm => { cm.AutoMap(); var idKeys = _memberResolver.KeyPropertyMembers.ToArray(); var idkey = idKeys.SingleOrDefault(); if (idkey == null) { if (idKeys.Length > 0) { throw new InvalidOperationException( "The MongoDb implementation of IDataStore<T> does not support multiple key members."); } throw new InvalidOperationException( string.Format( "System.ComponentModel.DataAnnotations.KeyAttribute must be associated with at least one member on {0} (even if BsonId is already used).", typeof(T).Name)); } cm.SetIdMember(cm.GetMemberMap(idkey.Name)); if (_memberResolver.IsAutoIdentity(idkey.Name)) { if (idkey.PropertyType == typeof(string)) { cm.IdMemberMap.SetIdGenerator(global::MongoDB.Bson.Serialization.IdGenerators.StringObjectIdGenerator.Instance); autoGenKey = true; } if (idkey.PropertyType == typeof(Guid)) { cm.IdMemberMap.SetIdGenerator(global::MongoDB.Bson.Serialization.IdGenerators.GuidGenerator.Instance); autoGenKey = true; } if (idkey.PropertyType == typeof(ObjectId)) { cm.IdMemberMap.SetIdGenerator(global::MongoDB.Bson.Serialization.IdGenerators.ObjectIdGenerator.Instance); autoGenKey = true; } if (!autoGenKey) { throw new NotImplementedException("Auto generated key for type " + idkey.Name + " not yet supported."); } } }); } }
public DataTableDataStore() { _memberResolver = new EntityMemberResolver <T>(); _dataTable = new DataTable(typeof(T).Name); _dataTable.BeginInit(); Dictionary <string, object> props = _memberResolver.ConvertToDictionary(Activator.CreateInstance <T>()); foreach (var prop in props) { var column = new DataColumn(prop.Key, _memberResolver.PropertyType(prop.Key)); if (_memberResolver.IsAutoIdentity(prop.Key)) { column.AutoIncrement = true; } _dataTable.Columns.Add(column); } _dataTable.EndInit(); AutoSave = true; }