Я использую Entity Framework / Azure Functions в попытке поддерживать базу данных в актуальном состоянии на основе этого репозитория GitHub csvs.
Процесс
- Функция таймера запускается и проверяет, доступна ли новая фиксация в master
- Если есть новый коммит, загрузите каждый CSV в хранилище BLOB-объектов Azure
- Триггер очереди будет запускаться при каждой загрузке 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; }
}