Как обрабатывать данные формы и извлекать свойства для двух разных моделей / таблиц с использованием Entity Framework - PullRequest
0 голосов
/ 06 марта 2020

У меня есть форма для основанной на реакции веб-игры с формой, которая содержит данные как о подземельях, так и о героях.

После того, как игрок заполнил ее и нажал "Отправить", она отправляется в мою сущность .NetCore 3.1. Framerwork API.

API должен сохранить его в 2 разных моделях, чтобы его можно было вставить в 2 разные таблицы базы данных.

Это Dungeon and Heroes.

I у меня есть контроллер, который должен принимать данные формы, и в настоящее время он выглядит так, как показано ниже.

Я выяснил, как использовать одну модель для обновления одной таблицы базы данных, но как мне это сделать для два?

Вот мой неработающий код контроллера, который я начал писать:

[HttpPost]
public async Task<ActionResult<CreateDungeon>> ProcessForm([FromBody]CreateDungeon data)
{
    // Read quest data from form and add to DB via EF
    _context.Quest.Add(data.Quest);
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
    {
        if (QuestExists(data.Quest.Id))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }

    // Read heroes data from form and add to DB via EF
    _context.Heroes.Add(data.Heroes);
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
    {
        if (HeroesExists(data.Heroes.Id))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }

    return Ok();
}

Это правильный способ сделать это?

Спасибо !

1 Ответ

1 голос
/ 09 марта 2020

Для хранения двух разных баз данных в ef-core вам нужно создать два разных dbcontexts.

Сначала в настройках приложения. json file :

"ConnectionStrings": {
    "DefaultConnection": "Connection string of the database where the quest table is located",
    "NewConnection": "Connection string of the database where the Heroes table is located"  }

Затем у вас должно быть два dbcontexts:

public class FirstdbContext : DbContext
{
    public FirstdbContext (DbContextOptions<FirstdbContext > options) : base(options)
    {
    }
    public DbSet<Quest> Quest { get; set; }

}



public class SeconddbContext : DbContext
{
    public SeconddbContext (DbContextOptions<SeconddbContext > options) : base(options)
    {
    }
    public DbSet<Heroes> Heroes { get; set; }

}

В файле startup.cs ConfigureServices:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddDbContext<FirstdbContext >(options =>
 options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddDbContext<SeconddbContext >(options =>
 options.UseSqlServer(Configuration.GetConnectionString("NewConnection")));
    }

После завершения вышеуказанных настроек контроллер должен сослаться на эти два dbcontexts.

[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
    private readonly MydbContext _context1;
    private readonly TestdbContext _context2;

    public HomeController (MydbContext context1, TestdbContext context2)
    {
        _context1 = context1;
        _context2 = context2;
    } 
    [HttpPost]
    public async Task<ActionResult<CreateDungeon>> ProcessForm([FromBody]CreateDungeon data)
    {
        // Read quest data from form and add to DB via EF
        _context1.Quest.Add(data.Quest);
        try
        {
            await _context1.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (QuestExists(data.Quest.Id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        // Read heroes data from form and add to DB via EF
        _context2.Heroes.Add(data.Heroes);
        try
        {
            await _context2.SaveChangesAsync();
        }
        catch (DbUpdateException)
        {
            if (HeroesExists(Heroes.Id))
            {
                return Conflict();
            }
            else
            { 
                throw;
            }
        }

        return Ok();
    } 

}

...