예제 #1
0
 public virtual MongoDbContextModel GetModel(AbpMongoDbContext dbContext)
 {
     return(ModelCache.GetOrAdd(
                dbContext.GetType(),
                _ => CreateModel(dbContext)
                ));
 }
예제 #2
0
    protected virtual MongoDbContextModel CreateModel(AbpMongoDbContext dbContext)
    {
        var modelBuilder = CreateModelBuilder();

        BuildModelFromDbContextType(modelBuilder, dbContext.GetType());
        BuildModelFromDbContextInstance(modelBuilder, dbContext);
        return(modelBuilder.Build(dbContext));
    }
예제 #3
0
    protected virtual void CreateCollectionIfNotExists(AbpMongoDbContext dbContext, string collectionName)
    {
        var filter  = new BsonDocument("name", collectionName);
        var options = new ListCollectionNamesOptions {
            Filter = filter
        };

        if (!dbContext.Database.ListCollectionNames(options).Any())
        {
            dbContext.Database.CreateCollection(collectionName);
        }
    }
예제 #4
0
 protected virtual void BuildModelFromDbContextInstance(IMongoModelBuilder modelBuilder, AbpMongoDbContext dbContext)
 {
     dbContext.CreateModel(modelBuilder);
 }
예제 #5
0
    public virtual MongoDbContextModel Build(AbpMongoDbContext dbContext)
    {
        lock (SyncObj)
        {
            var useAbpClockHandleDateTime = dbContext.LazyServiceProvider.LazyGetRequiredService <IOptions <AbpMongoDbOptions> >().Value.UseAbpClockHandleDateTime;

            var entityModels = _entityModelBuilders
                               .Select(x => x.Value)
                               .Cast <IMongoEntityModel>()
                               .ToImmutableDictionary(x => x.EntityType, x => x);

            var baseClasses = new List <Type>();

            foreach (var entityModel in entityModels.Values)
            {
                var map = entityModel.As <IHasBsonClassMap>().GetMap();

                if (useAbpClockHandleDateTime)
                {
                    var dateTimePropertyInfos = entityModel.EntityType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
                                                .Where(property =>
                                                       (property.PropertyType == typeof(DateTime) ||
                                                        property.PropertyType == typeof(DateTime?)) &&
                                                       property.CanWrite
                                                       ).ToList();

                    dateTimePropertyInfos.ForEach(property =>
                    {
                        var disableDateTimeNormalization =
                            entityModel.EntityType.IsDefined(typeof(DisableDateTimeNormalizationAttribute), true) ||
                            ReflectionHelper.GetSingleAttributeOfMemberOrDeclaringTypeOrDefault <DisableDateTimeNormalizationAttribute>(property) != null;

                        if (property.PropertyType == typeof(DateTime?))
                        {
                            map.MapProperty(property.Name).SetSerializer(new NullableSerializer <DateTime>().WithSerializer(new AbpMongoDbDateTimeSerializer(GetDateTimeKind(dbContext), disableDateTimeNormalization)));
                        }
                        else
                        {
                            map.MapProperty(property.Name).SetSerializer(new AbpMongoDbDateTimeSerializer(GetDateTimeKind(dbContext), disableDateTimeNormalization));
                        }
                    });
                }

                if (!BsonClassMap.IsClassMapRegistered(map.ClassType))
                {
                    BsonClassMap.RegisterClassMap(map);
                }

                baseClasses.AddRange(entityModel.EntityType.GetBaseClasses(includeObject: false));

                CreateCollectionIfNotExists(dbContext, entityModel.CollectionName);
            }

            baseClasses = baseClasses.Distinct().ToList();

            foreach (var baseClass in baseClasses)
            {
                if (!BsonClassMap.IsClassMapRegistered(baseClass))
                {
                    var map = new BsonClassMap(baseClass);
                    map.ConfigureAbpConventions();

                    if (useAbpClockHandleDateTime)
                    {
                        var dateTimePropertyInfos = baseClass.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
                                                    .Where(property =>
                                                           (property.PropertyType == typeof(DateTime) ||
                                                            property.PropertyType == typeof(DateTime?)) &&
                                                           property.CanWrite
                                                           ).ToList();

                        dateTimePropertyInfos.ForEach(property =>
                        {
                            if (property.PropertyType == typeof(DateTime?))
                            {
                                map.MapProperty(property.Name).SetSerializer(new NullableSerializer <DateTime>().WithSerializer(new AbpMongoDbDateTimeSerializer(GetDateTimeKind(dbContext), false)));
                            }
                            else
                            {
                                map.MapProperty(property.Name).SetSerializer(new AbpMongoDbDateTimeSerializer(GetDateTimeKind(dbContext), false));
                            }
                        });
                    }

                    BsonClassMap.RegisterClassMap(map);
                }
            }

            return(new MongoDbContextModel(entityModels));
        }
    }
예제 #6
0
 private DateTimeKind GetDateTimeKind(AbpMongoDbContext dbContext)
 {
     return(dbContext.LazyServiceProvider.LazyGetRequiredService <IOptions <AbpClockOptions> >().Value.Kind);
 }