Как мне обновить таблицу, объединенную с другой таблицей в Entity Framework? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующие объекты:

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

Как я могу обновить или добавить запись в объект PatchFile, еслиУ меня есть только PatchNumber, а не PatchId, чтобы предотвратить конфликт с ограничением FOREIGN KEY?

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

Над правильным подходом?Если да, то не совершается ли еще одна поездка в базу данных?Есть ли лучший подход?

1 Ответ

0 голосов
/ 24 ноября 2018

Вы можете добавить PatchID к SomeFilesViewModel вдоль PatchNumber.Иначе будет этот дополнительный запрос к БД.С другой стороны: это может создать еще одну возможную проблему, поскольку отправленные данные не обязательно должны быть точными, и вам нужно будет проверить / проверить их, и это будет еще одна поездка в БД.

Если вырешив придерживаться дополнительного запроса, я бы предложил переписать его следующим образом:

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

Таким образом, вы получите только идентификатор из БД;при условии, что вам не нужно работать с другими частями вашего Patch объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...