public async Task OnFileUploadAsync <T>(Stream stream, string separator) where T : class, IEntity, new() { StreamReader sr = new StreamReader(stream); var headers = new List <string>(sr.ReadLine().Split(separator).Select(s => s.ToUpper())); var props = typeof(T).GetProperties(); var columnsHash = new Hashtable(); var entities = new List <T>(); foreach (var prop in props) { var i = headers.IndexOf(prop.Name.ToUpper()); if (i >= 0) { columnsHash.Add(prop.Name, i); } } while (!sr.EndOfStream) { string[] values = Regex.Split(sr.ReadLine(), $"{separator}(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); T entity = new T(); foreach (var prop in props) { if (columnsHash.ContainsKey(prop.Name)) { var text = values[(int)columnsHash[prop.Name]]; TypeConverter tc = TypeDescriptor.GetConverter(prop.PropertyType); var value = string.IsNullOrWhiteSpace(text) ? null : tc.ConvertFromString(null, CultureInfo.InvariantCulture, text); prop.SetValue(entity, value); } } var complexEntity = entity as IComplexEntity; if (complexEntity != null && complexEntity.ParentId != null) { complexEntity.ParentSource = complexEntity.Source; } entities.Add(entity); } using (var t = await dbContext.Database.BeginTransactionAsync()) { var sql = $"ALTER TABLE {typeof(T).Name} NOCHECK CONSTRAINT ALL; SELECT TOP 1 * FROM {typeof(T).Name}"; dbContext.Set <T>().FromSql(sql).ToList(); await dbContext.BulkInsertOrUpdateAsync <T>(entities); sql = $"ALTER TABLE {typeof(T).Name} WITH CHECK CHECK CONSTRAINT ALL; SELECT TOP 1 * FROM {typeof(T).Name}"; dbContext.Set <T>().FromSql(sql).ToList(); t.Commit(); } }
private void Seed(EntitiesDBContext dbContext) { if (dbContext.Set <Asset>().Count() == 0) { var timeseriesMetadata1 = new TimeseriesMetadata { Source = "Seed", Id = "1", Name = "ABC123", Description = "Some tag", Units = "Pa" }; var timeseriesMetadata2 = new TimeseriesMetadata { Source = "Seed", Id = "2", Name = "ABC234", Description = "Some other tag", Units = "Pa" }; dbContext.Set <TimeseriesMetadata>().Add(timeseriesMetadata1); dbContext.Set <TimeseriesMetadata>().Add(timeseriesMetadata2); dbContext.Set <TimeseriesMetadata>().Add(new TimeseriesMetadata { Source = "Seed", Id = "3", Name = "Orphan" }); dbContext.Set <TimeseriesMetadata>().Add(new TimeseriesMetadata { Source = "Seed", Id = "4", Name = "Parent", Children = new List <TimeseriesMetadata> { new TimeseriesMetadata { Source = "Seed", Id = "5", Name = "Child" } } }); dbContext.Set <Entities.EventInfo>() .Add(new Entities.EventInfo { Id = "1", Source = "Seed", Time = DateTime.Now, Name = "Type" }); dbContext.Set <Entities.EventInfo>() .Add(new Entities.EventInfo { Id = "2", Source = "Seed", Time = DateTime.Now, Name = "Type" }); var file1 = new Entities.FileInfo { Source = "Seed", Id = "1", Format = "CSV", Filename = "ABC123.CSV" }; dbContext.Set <Entities.FileInfo>().Add(file1); var file2 = new Entities.FileInfo { Source = "Seed", Id = "2", Format = "CSV", Filename = "ABC124.CSV" }; dbContext.Set <Entities.FileInfo>().Add(file2); dbContext.Set <Asset>().Add( new Asset { Source = "Seed", Id = "1", Tag = "Site 1", Description = "Site 1", Files = new List <Entities.FileInfo> { file1 }, Tags = new List <AssetTag> { new AssetTag { Source = "Seed", Id = "1", Name = "key1", Value = "value1" }, new AssetTag { Source = "Seed", Id = "2", Name = "key2", Value = "value3" } }, TimeSeries = new List <TimeseriesMetadata> { timeseriesMetadata1 }, Children = new List <Asset> { new Asset { Source = "Seed", Id = "2", Description = "Drilling equipment and systems", Tag = "3", Children = new List <Asset> { new Asset { Source = "Seed", Id = "3", Description = "Mud supply", Tag = "325", Children = new List <Asset> { new Asset { Source = "Seed", Id = "4", Tag = "325-G1", Description = "Mud pump no.1", Manufacturer = "Some producer", SerialNumber = "1234568790", TimeSeries = new List <TimeseriesMetadata> { timeseriesMetadata1 } }, new Asset { Source = "Seed", Id = "5", Description = "Mud pump no.2", Tag = "325-G2", Manufacturer = "Some other producer", SerialNumber = "0987654321", TimeSeries = new List <TimeseriesMetadata> { timeseriesMetadata2 }, } } } } } } }); } dbContext.SaveChanges(); }