简体   繁体   English

如何更新与Entity Framework中的另一个表联接的表?

[英]How should I update a table that is joined with another table in Entity Framework?

I have the following entities: 我有以下实体:

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; }
  }
}

And I have the following api model: 我有以下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; }
  }
}

The GET method is implemented successfully as following: 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,
    });
}

Thus far, I have implemented the PUT method as following: 到目前为止,我已经实现了以下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);
}

And a sample payload: 和一个有效载荷样本:

Sample PayLoad:
{
  "FileId" = 4
  "PatchNumber" = 894
  "Name" = "MyFile.exe"
  Type = "Application"
}

How can I update or add a record to PatchFile entity if I only have the PatchNumber and not the PatchId to prevent conflicted with the FOREIGN KEY constraint? 如果我只有PatchNumber而没有PatchId,以防止与FOREIGN KEY约束冲突,如何更新记录或向PatchFile实体添加记录?

_context.Patch.FirstOrDefault(i => i.Number == someFileViewModel.PatchNumber).PatchID 

Is above the correct approach? 以上是正确的方法吗? If yes, Is this not making another trip to database? 如果是,这是否不会再次访问数据库? Is there a better approach? 有没有更好的方法?

You could add the PatchID to the SomeFilesViewModel along the PatchNumber. 您可以将SomeFilesViewModel沿着PatchNumber添加到SomeFilesViewModel中。 Otherwise there will be this extra query to the DB. 否则,将向数据库发送此额外查询。 On the other hand: this might create another possible problem, as the sent data don't have to be accurate and you'll need to check/validate it and that would be another trip to DB. 另一方面:这可能会导致另一个可能的问题,因为发送的数据不一定准确,您需要检查/验证它,这将是另一次访问数据库的旅程。

If you decide to stick with the extra query I would suggest rewriting it as following: 如果您决定坚持使用额外的查询,我建议将其重写如下:

_context.Patch.Where(i => i.Number == someFileViewModel.PatchNumber).Select(i => i.PatchID).FirstOrDefault();

That way you get only the ID from the DB; 这样,您只能从数据库获得ID。 assuming you don't need to work with other parts of your Patch object. 假设您不需要使用Patch对象的其他部分。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM