C# 通过控制器中的外键关系显示表的实体

C# 通过控制器中的外键关系显示表的实体,c#,entity-framework,azure,swagger,C#,Entity Framework,Azure,Swagger,我正在编写我的第一个在Azure上托管的webapi2控制器应用程序 我正在使用swagger测试API 我现在正在编写第一个通过webapi2控制器方法写入数据库的方法 当我进入swagger测试我在“示例值”中看到的方法时,我正在编写的表以及与之相关的所有表 这对我来说是一个危险信号,因为有人可以根据我看到的内容直接将值写入这些表,而不受限制 示例表是一个科目表: { "id": "string", "email": "string", "firstname"

我正在编写我的第一个在Azure上托管的webapi2控制器应用程序

我正在使用swagger测试API

我现在正在编写第一个通过webapi2控制器方法写入数据库的方法

当我进入swagger测试我在“示例值”中看到的方法时,我正在编写的表以及与之相关的所有表

这对我来说是一个危险信号,因为有人可以根据我看到的内容直接将值写入这些表,而不受限制

示例表是一个科目表:

{    
    "id": "string",
    "email": "string",
    "firstname": "string",
    "lastname": "string",
    "UserLevel": [
    {
        "pk": "string",
        "fkAccount": "string",
        "Level": 0
    }
}
我关心的领域是UserLevel,我只想在后端设置它。我不希望通过API设置可见

控制器代码如下所示:

    public async Task<IHttpActionResult> PutAccount(string id, Account Account)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != Account.id)
        {
            return BadRequest();
        }

        db.Entry(Account).State = EntityState.Modified;

        try
        {
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!AccountExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.OK);
    }
公共异步任务PutAccount(字符串id,帐户)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
if(id!=Account.id)
{
返回请求();
}
db.Entry(Account.State=EntityState.Modified;
尝试
{
等待db.saveChangesSync();
}
catch(DbUpdateConcurrencyException)
{
如果(!AccountExists(id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回状态码(HttpStatusCode.OK);
}
所以有两个问题: 1) 我是否正确地假设这将提供在UserLevel表中使用上面显示的内容设置“级别”的能力?
2) 如何防止这种情况发生/只允许写回一个表?

您可以使用AccountDTO类,该类只包含要修改的属性并将其设置为Account对象,或者您可以在数据库中获取帐户,并手动更新每个字段(考虑到您在控制器中具有数据访问权限,大致相同)

如果您只想更新一些属性,我会将这些属性作为参数接收,而不是整个Account对象