是否可以使用DbContext代码从WebApi访问JSON数据?

时间:2018-10-25 10:18:35

标签: c# asp.net asp.net-core asp.net-core-webapi dbcontext

我有一个ASP.NET Core 2.1 Web应用程序,该应用程序是按照ASP.NET Core文档中Create Razor pages web app中的步骤创建的。一切都按预期进行,我使用了在搭建模型时创建的默认localdb。那部分很好。

但是,我需要做的是在生产环境中尝试使用相同的通用代码,在该生产环境中,所有CRUD函数都通过使用与我的Model对象直接匹配的JSON数据调用WebApi方法来执行。

例如,通过脚手架为“创建”创建的页面是这样的:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _context.Registration.Add(Registration); // Here
    await _context.SaveChangesAsync();       // Here

    return RedirectToPage("./Index");
}

public async Task OnGetAsync()
{
    Registration = await _context.Registration.ToListAsync(); // Here
}

是否可以简单地更改每次出现的_context操作(如标记为“ // Here”的行)来使用对WebApi方法的调用?有没有更好的方法可以完成我想做的事情?

1 个答案:

答案 0 :(得分:0)

您只能使用实体类。但是,您可以将JSON转换为您的实体类之一的实例。例如:

using (var response = await _client.GetAsync("/foo/1"))
{
    var foo = await response.ReadAsAsync<Foo>();
    _context.Add(foo);
    await _context.SaveChangesAsync();
}

ReadAsAsync方法是语法糖,它简单地将响应读取为字符串,然后将其传递给JSON.NET以转换为指定的类型。如果只有JSON字符串,则可以利用:

var foo = JsonConvert.DeserializeObject<Foo>(jsonString);

也就是说,这是一种代码气味。如果您的API已与您的实体类进行交互,则所有工作都应在此完成。如果要添加新实体,则API上应该有一个端点。对于所有其他CRUD操作,也是如此。在相同的上下文中使用两个不同的应用程序,并且仅在其中部分运行,这是灾难的根源。