C# 如何使用实体框架处理两个不同模型/表的表单数据和提取属性
我在一个基于react的网络游戏中有一个表单,其中包含地牢和英雄数据 播放器填写并点击提交后,它将被发送到my.NetCore 3.1 Entity Framerwork API API需要将其保存到两个不同的模型中,以便可以将其插入到两个不同的数据库表中 那些是地牢和英雄 我有一个控制器,它应该接受表单数据,它当前看起来就像下面所示 我已经知道了如何使用一个模型来更新一个数据库表,但是如何为两个数据库表更新呢 以下是我开始编写的非工作控制器代码: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
[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,您将两个表保存到数据库中的方式是正确的,我不确定您面临的确切问题是什么,请详细解释哪些代码出错以及错误消息。(如果您解决了,请忽略此注释)使用多个表时会遇到什么问题?在一个数据库中有多个表是没有问题的,实体框架上下文可以为您拥有的不同表具有多个属性。请在你的问题中加入你的源代码,这些源代码可以被其他人编译和测试。