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