Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架处理两个不同模型/表的表单数据和提取属性_C#_Entity Framework Core_Asp.net Core Webapi_.net Core 3.0 - Fatal编程技术网

C# 如何使用实体框架处理两个不同模型/表的表单数据和提取属性

C# 如何使用实体框架处理两个不同模型/表的表单数据和提取属性,c#,entity-framework-core,asp.net-core-webapi,.net-core-3.0,C#,Entity Framework Core,Asp.net Core Webapi,.net Core 3.0,我在一个基于react的网络游戏中有一个表单,其中包含地牢和英雄数据 播放器填写并点击提交后,它将被发送到my.NetCore 3.1 Entity Framerwork API API需要将其保存到两个不同的模型中,以便可以将其插入到两个不同的数据库表中 那些是地牢和英雄 我有一个控制器,它应该接受表单数据,它当前看起来就像下面所示 我已经知道了如何使用一个模型来更新一个数据库表,但是如何为两个数据库表更新呢 以下是我开始编写的非工作控制器代码: [HttpPost] public async

我在一个基于react的网络游戏中有一个表单,其中包含地牢和英雄数据

播放器填写并点击提交后,它将被发送到my.NetCore 3.1 Entity Framerwork API

API需要将其保存到两个不同的模型中,以便可以将其插入到两个不同的数据库表中

那些是地牢和英雄

我有一个控制器,它应该接受表单数据,它当前看起来就像下面所示

我已经知道了如何使用一个模型来更新一个数据库表,但是如何为两个数据库表更新呢

以下是我开始编写的非工作控制器代码:

[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();
}
[HttpPost]
公共异步任务ProcessForm([FromBody]CreateDungeon数据)
{
//从表单读取任务数据并通过EF添加到DB
_context.Quest.Add(data.Quest);
尝试
{
wait_context.SaveChangesAsync();
}
捕获(DbUpdateException)
{
if(QuestExists(data.Quest.Id))
{
返回冲突();
}
其他的
{
投
}
}
//从表单读取数据并通过EF添加到数据库
_context.heromes.Add(data.heromes);
尝试
{
wait_context.SaveChangesAsync();
}
捕获(DbUpdateException)
{
if(heroESists(data.heros.Id))
{
返回冲突();
}
其他的
{
投
}
}
返回Ok();
}
这是正确的做法吗


谢谢

要在ef core中存储两个不同的数据库,需要创建两个不同的DBContext

首先,在appsettings.json文件中:

"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"  }
然后,您应该有两个DBContext:

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; }

}
public类FirstdbContext:DbContext
{
public FirstdbContext(DbContextOptions选项):基本(选项)
{
}
公共数据库集任务{get;set;}
}
公共类SeconddbContext:DbContext
{
public SeconddbContext(DbContextOptions选项):基本(选项)
{
}
公共数据库集{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")));
    }
public void配置服务(IServiceCollection服务)
{
services.AddControllersWithViews();
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“NewConnection”));
}
完成上述设置后,控制器需要引用这两个DBContext

[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();
    } 
[路由(“api/[控制器]”)]
[ApiController]
公共类家庭控制器:ControllerBase
{
私有只读MydbContext_context1;
私有只读TestdbContext_context2;
公共HomeController(MydbContext上下文1、TestdbContext上下文2)
{
_context1=context1;
_context2=context2;
} 
[HttpPost]
公共异步任务ProcessForm([FromBody]CreateDungeon数据)
{
//从表单读取任务数据并通过EF添加到DB
_context1.Quest.Add(data.Quest);
尝试
{
wait_context1.SaveChangesAsync();
}
捕获(DbUpdateException)
{
if(QuestExists(data.Quest.Id))
{
返回冲突();
}
其他的
{
投
}
}
//从表单读取数据并通过EF添加到数据库
_context2.heromes.Add(data.heromes);
尝试
{
wait_context2.SaveChangesAsync();
}
捕获(DbUpdateException)
{
如果(英雄存在者(英雄Id))
{
返回冲突();
}
其他的
{ 
投
}
}
返回Ok();
} 

}

两个不同的数据库表,而不是两个不同的数据库:)@SkyeBoniwells,您将两个表保存到数据库中的方式是正确的,我不确定您面临的确切问题是什么,请详细解释哪些代码出错以及错误消息。(如果您解决了,请忽略此注释)使用多个表时会遇到什么问题?在一个数据库中有多个表是没有问题的,实体框架上下文可以为您拥有的不同表具有多个属性。请在你的问题中加入你的源代码,这些源代码可以被其他人编译和测试。