У меня есть класс модели, который включает в себя список других классов модели.Кроме того, я использую общий репозиторий для управления базой данных.Классы моделей следующие:
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);
}
Это правильный способ изменения внутреннего списка коллекции или нет?Как я могу написать этот кусок кода?