Хранилище таблиц и DBContext в ASP.NET Core

Чтобы подключиться к базе данных в основном приложении ASP.NET, мы создаем DbContext.

namespace MyProject.Models
{
    public class MyProjectContext : DbContext
    {
        public MyProjectContext (DbContextOptions<MyProjectContext> options)
            : base(options){ }

        public DbSet<MyProject.Models.Record> Record { get; set; }
    }
}

В Startup.cs делаем

public void ConfigureServices(IServiceCollection services) {
    // Adds services required for using options.
    //...
    // Add framework services.
    services.AddMvc();

    services.AddDbContext<MyProjectContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MyProjectContext")));
}

И, наконец, в контроллере у нас есть

namespace MyProject.Controllers
{
    public class RecordsController : Controller
    {
        private readonly MyProjectContext _context;

        public RecordsController(MyProjectContext context) {
            _context = context;    
        } 

        // GET: Records
        public async Task<IActionResult> Index() {
            return View(await _context.Record.ToListAsync());
        }

Хорошо, все это из строительных лесов VS...

=============================================================

Теперь мне нужно работать с AzureTables, поэтому я сделал тестовый контроллер, который

Startup.cs

    public void ConfigureServices(IServiceCollection services) {
        // Adds services required for using options.
        ...
        // Register the IConfiguration instance which "ConnectionStrings" binds against.
        services.Configure<AppSecrets>(Configuration);

HelloWorldController.cs

namespace MyProject.Controllers
{
    public class HelloWorldController : Controller
    {        
        CloudTableClient cloudTableClient = null;

        public HelloWorldController(IOptions<AppSecrets> optionsAccessor) {
            string azureConnectionString = optionsAccessor.Value.MyProjectTablesConnectionString;
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(azureConnectionString);
            cloudTableClient = cloudStorageAccount.CreateCloudTableClient();
        }    

        public async Task<string> ReadTables() {
            CloudTable table = cloudTableClient.GetTableReference("themes");

            StringBuilder response = new StringBuilder("Here is your test Table:");
            var query = new TableQuery<DescriptionEntity>() {
                SelectColumns = new List<string> { "RowKey", "Description" }
            };
            var items = await table.ExecuteQuerySegmentedAsync<DescriptionEntity>(query, null);
            foreach (DescriptionEntity item in items) {
                response.AppendLine($"Key: {item.RowKey}; Value: {item.Description}");
            }

            return response.ToString();
        } 

Вопрос

Как интегрировать Azure Tables так же, как это делает SQL Context? Я имею в виду те же 3 шага для таблиц Azure:

  1. Создайте контекст таблиц Azure,
  2. Настройка служб (через ConfigureServices(IServiceCollection) в Startup.cs),
  3. Передайте «контекст IAzureTable» конструктору контроллера?.

Я полный новичок, буду очень признателен за пример кода шагов.

Как, например, создать Azure DBContext (если в этом есть необходимость)?


comment
Прямо сейчас контроллер тесно связан с проблемами реализации. Извлечение этих реализаций и инкапсуляция их за абстракцией — хорошая идея. Это то, что я понял из вашего вопроса.   -  person Nkosi    schedule 18.07.2017
comment
Я бы дополнительно извлек интерфейс и использовал для него DI/IoC и преобразователь зависимостей, но на самом деле не знаю, как его реализовать... Вопрос, похожий на этот: stackoverflow.com/questions/24626749/   -  person serge    schedule 18.07.2017
comment
Код в вопросе - это именно то, что я имею в виду. Постарайтесь максимально абстрагироваться, чтобы избежать привязки к проблемам реализации, и внедрить их в контроллер. Относитесь к лазурной таблице просто как к источнику данных, который можно заменить какой-либо другой реализацией в будущем.   -  person Nkosi    schedule 18.07.2017
comment
Есть идеи, как это сделать, поэтому вопрос   -  person serge    schedule 19.07.2017


Ответы (1)


Согласно этой статье (дорожная карта EF), таблица Azure хранилище, так как база данных EF dbcontext сейчас не поддерживает. Он входит в число функций с высоким приоритетом и будет выпущен в будущем.

Таким образом, теперь мы не могли использовать хранилище таблиц в качестве dbcontext EF в ядре .net.

Вы могли видеть, что «Функции с высоким приоритетом» содержат поставщика лазурной таблицы, как показано ниже.

High priority features

Providers

Azure Table Storage
Redis
Other non-relational databases  

Если вы хотите использовать хранилище таблиц Azure в сетевом ядре, я предлагаю вам использовать SDK хранилища Azure (установленный из пакета Nuget) и написать собственную логику для CRUD данных.

person Brando Zhang    schedule 20.07.2017
comment
к сожалению, это будет ответ, и то, что я, наконец, сделал, однако это было непросто, потому что почти нет документации от Microsoft о подключении Azure (таблицы) к ASP.NET Core. - person serge; 20.07.2017