Entity Framework - Сравните CSV с таблицей - PullRequest
0 голосов
/ 04 мая 2019

Я использую Entity Framework / Azure Functions в попытке поддерживать базу данных в актуальном состоянии на основе этого репозитория GitHub csvs.

Процесс

  1. Функция таймера запускается и проверяет, доступна ли новая фиксация в master
  2. Если есть новый коммит, загрузите каждый CSV в хранилище BLOB-объектов Azure
  3. Триггер очереди будет запускаться при каждой загрузке BLOB-объекта. Прочитайте CSV с помощью CsvHelper и загрузите его в базу данных (см. Код ниже)

Цель

Я хочу улучшить шаг 4. Вместо того, чтобы полностью отбрасывать таблицу, а затем воссоздавать все, я хочу сделать что-то вроде сравнения и затем оттуда сохранить (или удалить).

Код

    [FunctionName("CsvQueueProcessor")]
    public async void Run([QueueTrigger("csvqueue", Connection = "AzureWebJobsStorage")]string myQueueItem, ILogger log)
    {
        var context = new ChadwickDbContext(Environment.GetEnvironmentVariable("DefaultConnectionString"));
        var csvEntity = JsonConvert.DeserializeObject<CsvProcessorEntity>(myQueueItem);
        if (csvEntity.FileName.ToLower() != "allstarfull.csv") return;
        log.LogInformation($"About to get the file from blob storage: {csvEntity.FileName}");
        var container = CloudBlobClient.GetContainerReference("csvs");
        await container.CreateIfNotExistsAsync();
        var blob = container.GetBlobReference(csvEntity.FileName);
        var stream = await blob.OpenReadAsync();
        var csv = new CsvReader(new StreamReader(stream));
        while(csv.Read())
        {
            var record = csv.GetRecord<AllStarFull>();
            context.AllStarFull.Add(record);
        }

        await context.SaveChangesAsync();
    }

Все отлично работает! Но как бы я занялся диффузией? Существуют ли какие-либо особенности структуры сущностей, которые допускают какое-либо сравнение или «никаких действий», если запись уже существует? Я наткнулся на эту ветку, но я не думаю, что это именно то, что я хочу.

    public class AllStarFull
    {
        [Ignore]
        public int Id { get; set; }
        [Name("playerID")]
        public string PlayerId {get;set;}
        [Name("yearID")]
        public int YearId {get;set;}
        [Name("gameNum")]
        public int? GameNumber {get;set;}
        [Name("teamID")]
        public string TeamId {get;set;}
        [Name("lgID")]
        public string LeagueId {get;set;}
        [Name("GP")]
        public int? PlayedInGame { get; set; }
        [Name("startingPos")]
        public int? StartingPosition { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...