c# - 我应该如何更新与实体框架中另一个表连接的表?
问题描述
我有以下实体:
namespace SomeDataAccess
{
public partial class Patch
{
public int PatchID { get; set; }
public double Number { get; set; }
}
public partial class PatchFile
{
public int FileID { get; set; }
public int PatchID{ get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
}
我有以下 api 模型:
namespace Web_API.Models
{
[Table("SomeFiles")]
public class SomeFilesViewModel
{
[Key]
public int FileId { get; set; }
public int PatchNumber{ get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
}
GET方法成功实现如下:
/ GET: api/SomeFiles/5
[ResponseType(typeof(SomeFileViewModel))]
public async Task<IHttpActionResult> GetSomeFileViewModel(int id)
{
var patchFile = await _context.PatchFile.FindAsync(id);
return someFile == null
? (IHttpActionResult)NotFound()
: Ok(new someFileViewModel
{
FileId = patchFile.FileID,
PatchNumber = patch.Number,
Name = patchFile.Name,
Type = patchFile.Type,
});
}
到目前为止,我已经实现了 PUT 方法如下:
// PUT: api/SomeFiles
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutSomeFileViewModel(SomeFilesViewModel someFileViewModel)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
var file = new SomeDataAccess.PatchFile
{
FileID = someFileViewModel.FileId,
PatchID = _context.Patch.FirstOrDefault(i => i.Number == someFileViewModel.PatchNumber).PatchID
// How to get the relavent patch id by having the patch Number?
Name = someFileViewModel.Name,
Type = someFileViewModel.Type
};
_context.Entry(file).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!FileExists(file.FileID))
return NotFound();
throw;
}
return StatusCode(HttpStatusCode.NoContent);
}
和一个示例有效载荷:
Sample PayLoad:
{
"FileId" = 4
"PatchNumber" = 894
"Name" = "MyFile.exe"
Type = "Application"
}
如果我只有 PatchNumber 而没有 PatchId 以防止与 FOREIGN KEY 约束冲突,如何更新或向 PatchFile 实体添加记录?
_context.Patch.FirstOrDefault(i => i.Number == someFileViewModel.PatchNumber).PatchID
以上是正确的做法吗?如果是,这不是再次访问数据库吗?有更好的方法吗?
解决方案
您可以将 PatchID 添加到SomeFilesViewModel
PatchNumber 中。否则会有这个额外的数据库查询。另一方面:这可能会产生另一个可能的问题,因为发送的数据不必准确,您需要检查/验证它,这将是另一次访问数据库。
如果您决定坚持使用额外的查询,我建议您将其重写如下:
_context.Patch.Where(i => i.Number == someFileViewModel.PatchNumber).Select(i => i.PatchID).FirstOrDefault();
这样你就只能从数据库中获得 ID;假设您不需要使用Patch
对象的其他部分。
推荐阅读
- gradle - Gradle 5 QueryDsl 生成重复类
- javascript - HttpClientXsrfModule 是否仍需要在服务器上设置 XSRF-TOKEN?
- php - 多次覆盖 setAttribute 和 getAttribute 函数(在不同的特征中)
- rest - RESTful Web 服务中的 GET、POST 和 PUT 有什么区别
- python - 如何使用 numpy 沿右轴进行标量积并将过程矢量化
- react-native - 如何在stackNavigator的标题按钮中添加菜单
- c - C - 将枚举用于位标志 - 警告:枚举类型与另一种类型混合
- javascript - 给我的表的每一行添加onclick函数只记录最后一行
- r - geom_histogram 数据的线性模型
- javascript - 替换单词 Jquery,只有一次