У меня есть действие контроллера веб-приложения, которое создает дочернюю сущность. У меня есть модель Location с коллекцией LocationPic. Я пытаюсь добавить новый LocationPic к существующему Location. Локально это работает нормально, но когда я запускаю его в Azure, создается LocationPic, но не ссылается на Location. Таким образом, я получаю осиротевший LocationPic, который не знает, к какому местоположению он принадлежит.
Кроме того, он отлично работает локально и в Azure для местоположений, которые УЖЕ имеют фотографии (у меня есть отдельный контроллер API, который, кажется, работает нормально). Так что я могу добавить новые картинки в локации, которые уже есть. Но я не могу добавить новые фотографии в новое место, где нет фотографий.
Вот мое действие контроллера:
// POST: Pictures/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("LocationID,Name,Description")] LocationPic locationPic, IFormFile image)
{
var location = await _context.Locations.FindAsync(locationPic.LocationID);
if (location == null)
{
return NotFound();
}
Trace.TraceInformation($"Create Pic for location[{location.LocationID}:{location.LocationName}]");
_userService = new UserService((ClaimsIdentity)User.Identity, _context);
if (!_userService.IsAdmin)
{
return Unauthorized();
}
if (image == null)
{
return BadRequest();
}
if (String.IsNullOrEmpty(locationPic.Name))
{
locationPic.Name = image.FileName;
}
var helper = new AzureTools();
var filename = await helper.GetFileName(image);
locationPic.FileName = filename;
//Added this to try to force LocationPics to be initialized
if (location.LocationPics == null)
{
Trace.TraceInformation("location.LocationPics is null");
location.LocationPics = new List<LocationPic>();
}
else
{
Trace.TraceInformation($"location.LocationPics count == {location.LocationPics.Count}");
}
if (ModelState.IsValid)
{
Trace.TraceInformation($"Location pic valid: [{locationPic.LocationID}] {locationPic.Name}");
//Overly-explicit attempts to get entities linked
locationPic.Location = location;
location.LocationPics.Add(locationPic);
//I've tried _context.LocationPics.Add as well and seemingly no difference
_context.Add(locationPic);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Edit), new { locationID = location.LocationID });
} else
{
Trace.TraceInformation("Invalid model state");
return BadRequest();
}
}
Кажется, вся правильная информация входит в мои параметры из моей формы, и LocationPic создается отлично. Он просто не связан с Location, несмотря на то, что «LocationID» отображается правильно перед сохранением. Кроме того, я получаю правильное перенаправление назад к действию «Редактировать», а не к «БадРеквесту» или чему-либо еще.
Локально, единственное отличие, которое я заметил, состоит в том, что у Location без картинок есть LocationPics, который является пустой коллекцией с Count == 0. В Azure для местоположения без изображений, как представляется, значение LocationPics имеет значение null. Вот почему я попытался добавить бит, который инициализирует его, если он нулевой, хотя мой работающий контроллер API не должен был делать ничего подобного.
Вот мое (работающее) действие API Controller, для справки:
[HttpPost("{id}", Name = "PostPicture")]
public async Task<IActionResult> PostPicture([FromRoute] int id, IFormFile image, string Name, string Description)
{
var location = _context.Locations.Find(id);
if (location == null)
{
return NotFound();
}
_userService = new UserService((ClaimsIdentity)User.Identity, _context);
if (!_userService.IsCustomer(location.CustomerID))
{
return Unauthorized();
}
if (image == null)
{
return BadRequest();
}
if (String.IsNullOrEmpty(Name))
{
Name = image.FileName;
}
var helper = new AzureTools();
var filename = await helper.GetFileName(image);
var locationPic = new LocationPic
{
Name = Name,
FileName = filename,
Description = Description,
Location = location
};
_context.LocationPics.Add(locationPic);
_context.SaveChanges();
return Ok(filename);
}