Я использую Entity Framework с веб-интерфейсом API 2. У меня есть объект лодки с такими свойствами, как имя, цена и т. Д. Эти простые свойства обновляются отлично при отправке с помощью Put to web api controller , Судно судна также имеет много отношений с сущностью под названием BoatType. Типы лодок - «Яхта», «Моторная яхта» и т. Д.Entity Framework не обновляет внешний ключ при обновлении сущностей
Когда объект лодки обновляется в контроллере, внешний ключ для типа лодки в базе данных не обновляется. Должен ли я как-то вручную обновлять значение дочернего объекта или есть способ получить EF для этого автоматически?
Вот запрос пример PUT отправлен веб-API:
{
"$id":"1",
"Images":[],
"BoatType": {
"$id":"3",
"Boat":[],
"Id":1,
"DateCreated":"2015-09-15T13:14:39.077",
"Name":"Yacht"
},
"Id":2,
"Name":"Schooner",
"Description":"A harmless schooner",
"DateCreated":"2015-09-15T17:59:37.8",
"Price":65000
}
Вот функция обновления в веб-API:
[ResponseType(typeof(void))]
public async Task<IHttpActionResult> Put(int id, Boat boat)
{
if (id != boat.Id)
{
return BadRequest();
}
_db.Entry(boat).State = EntityState.Modified;
try
{
await _db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!BoatExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
Я посмотрел на подобные вопросы, как Entity Framework Code First Update Does Not Update Foreign Key, Entity Framework does not update Foreign Key object и Update foreign key using Entity Framework но ни один из них не имеет такого же сценария (или ответы не помогли мне понять мою проблему).
Вот классы моделей Boat and BoatType (автогенерируемые дизайнером EF).
public partial class Boat
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Boat()
{
this.Images = new HashSet<Image>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public System.DateTime DateCreated { get; set; }
public Nullable<double> Price { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Image> Images { get; set; }
public virtual BoatType BoatType { get; set; }
}
public partial class BoatType
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public BoatType()
{
this.Boat = new HashSet<Boat>();
}
public int Id { get; set; }
public System.DateTime DateCreated { get; set; }
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Boat> Boat { get; set; }
}
«... обновляется в контроллере, внешний ключ для типа лодки в базе данных не обновляется». Ну, вы передаете действительный идентификатор типа лодки в объекте лодки? Не относится к вашему вопросу: почему вы передаете идентификатор в дополнение к объекту лодки, который содержит идентификатор? Кажется странным. – Sam
Определяете ли вы FK на своих моделях, т. Е. Лодка содержит свойство BoatTypeID, а также свойство BoatType? – Sam
Да, идентификатор BoatType 1 в приведенном выше PUT действителен. – Danzig