Обновить или вставить список элементов в коллекции mongodb с помощью c # - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть класс модели, который включает в себя список других классов модели.Кроме того, я использую общий репозиторий для управления базой данных.Классы моделей следующие:

public abstract class Entity : Document
    {
        [BsonRepresentation(BsonType.Int32)]
        public int CreateUserId { get; set; }
        [BsonRepresentation(BsonType.Int32)]
        public int ChangeUserId { get; set; }
        [BsonDateTimeOptions(Kind = DateTimeKind.Utc, Representation = BsonType.DateTime)]
        public DateTime ChangeDate { get; set; }
        [BsonElement("CreateUser")]
        public virtual User CreateUser { get; set; }
        [BsonElement("ChangeUser")]
        public virtual User ChangeUser { get; set; }

    }

public class TrackedEntity : Entity
    {
        public bool Deleted { get; set; }

    }

public class GasStation : TrackedEntity
    {
        [BsonElement("Name")]
        public string Name { get; set; }
        public List<GasStationShift> GasStationShiftList { get; set; }
        public List<Tank> TankList { get; set; }
    }

и

public class GasStationShift : TrackedEntity
    {
        [BsonElement("ShiftId")]
        public int ShiftId { get; set; }
        [BsonRepresentation(BsonType.String)]
        public string GasStationId { get; set; }
        [BsonElement("StartFrom")]
        public string StartFrom { get; set; }
        [BsonElement("EndTo")]
        public string EndTo { get; set; }

    }

А мой GenericRepository выглядит так:

public class GenericRepository<T> : BaseMongoRepository, IRepository<T> where T : Entity
    {
        private readonly IMongoDbContext _context;
        public GenericRepository(IMongoDbContext context) : base(context)
        {

            _context = context;
        }
        public async Task AddAsync(T Item)
        {
            await _context.GetCollection<T>().InsertOneAsync(Item);
        }

        public async Task AddAllAsync(IEnumerable<T> Items)
        {
            await _context.GetCollection<T>().InsertManyAsync(Items);
        }

        public async Task DeleteAsync(Guid PrimaryKey)
        {
            var filter = Builders<T>.Filter.Eq("Id", PrimaryKey);
            await _context.GetCollection<T>().DeleteOneAsync(filter);
        }

        public async Task<List<T>> GetAsync(Expression<Func<T, bool>> predicate)
        {
            return await _context.GetCollection<T>().Find(predicate).ToListAsync();
        }

        public async Task<List<T>> GetAllAsync()
        {
            return await _context.GetCollection<T>().Find(_ => true).ToListAsync();
        }

        public async Task<T> GetByIDAsync(Guid Id)
        {
            var filter = Builders<T>.Filter.Eq("Id", Id);
            return await _context.GetCollection<T>().Find(filter).FirstOrDefaultAsync();
        }

        public async Task SaveAsync(T Item)
        {
            await _context.GetCollection<T>().InsertOneAsync(Item);
        }

        public async Task SaveAllAsync(IEnumerable<T> Items)
        {
            await _context.GetCollection<T>().InsertManyAsync(Items);
        }
    }

В моем слое обслуживания для обновленияGasStationShiftList или вставьте новый элемент, который мне нравится, как показано ниже:

public async Task AddGasStationShift(GasStationShift gasStationShift)
        {
            GasStation gasStation = await _gasStationRepo.GetByIDAsync(Guid.Parse(gasStationShift.GasStationId));
            gasStation.GasStationShiftList.Add(gasStationShift);
// The type GasStation can not be used as type parameter TDocument compile time error
            await _gasStationRepo.UpdateOneAsync<GasStation>(gasStation);
        }

Это правильный способ изменения внутреннего списка коллекции или нет?Как я могу написать этот кусок кода?

...