using System; using System.Data.SqlClient; using Microsoft.Azure.KeyVault; using Microsoft.Azure.KeyVault.Models; using Microsoft.Azure.Services.AppAuthentication; using System.Threading.Tasks; using System.Collections.Generic; using System.Linq; namespace AzureSqlEFSample { class Program { static void Main(string[] args) { System.Threading.Tasks.Task task = Program.DoWork(args); // Becuase this program takes user input, have a long wait. var result = task.Wait(TimeSpan.FromMinutes(30)); } static async System.Threading.Tasks.Task DoWork(string[] args) { string sql; Console.WriteLine("** C# CRUD sample with Entity Framework and Azure SQL **\n"); // Build connection string SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = "your_server.database.windows.net"; // update me builder.UserID = "your_user"; // update me builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault builder.InitialCatalog = "your_db"; // Update me using (EFSampleContext context = new EFSampleContext(builder.ConnectionString)) { try { // Create demo: Create a Task instance and save it to the database Task newTask = new Task() { Title = "Ship Helsinki", IsComplete = false, DueDate = DateTime.Parse("04-01-2017") }; context.Tasks.Add(newTask); context.SaveChanges(); Console.WriteLine("\nCreated Task: " + newTask.ToString()); // Association demo: Assign task to user // Read demo: find incomplete tasks assigned to user 'Anna' Console.WriteLine("\nIncomplete tasks assigned to 'Anna':"); var query = from t in context.Tasks where t.IsComplete == false && t.AssignedTo.FirstName.Equals("Anna") select t; foreach (var t in query) { Console.WriteLine(t.ToString()); } // Update demo: change the 'dueDate' of a task Task taskToUpdate = context.Tasks.First(); // get the first task Console.WriteLine("\nUpdating task: " + taskToUpdate.ToString()); taskToUpdate.DueDate = DateTime.Parse("06-30-2016"); context.SaveChanges(); Console.WriteLine("dueDate changed: " + taskToUpdate.ToString()); // Delete demo: delete all tasks with a dueDate in 2016 Console.WriteLine("\nDeleting all tasks with a dueDate in 2016"); DateTime dueDate2016 = DateTime.Parse("12-31-2016"); List queryResults = context.Tasks.Where(t => t.DueDate < dueDate2016).ToList(); foreach (Task t in queryResults) { Console.WriteLine("Deleting task: " + t.ToString()); context.Tasks.Remove(t); } context.SaveChanges(); // Show tasks after the 'Delete' operation - there should be 0 tasks Console.WriteLine("\nTasks after delete:"); List tasksAfterDelete = (from t in context.Tasks select t).ToList(); if (tasksAfterDelete.Count == 0) { Console.WriteLine("[None]"); } else { foreach (Task t in query) { Console.WriteLine(t.ToString()); } } } catch (SqlException e) { Console.WriteLine(e.ToString()); } } Console.WriteLine("All done. Press any key to finish..."); Console.ReadKey(true); } private static async Task GetPasswordFromKeyVault() { Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); Console.ReadKey(true); /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_keyvault_name.vault.azure.net/secrets/AppSecret"); // update me return secret.Value; } } }