我正在使用实体框架和Web API 2.我有一个名称,价格等属性的船只实体。这些简单的属性更新时发送通过放到网络API控制器。船实体也与称为BoatType的实体有多对一的关系。游艇类型为“游艇”,“摩托游艇”等。当实体更新时,实体框架不更新外键
当船舶实体在控制器中更新时,数据库中船型的外键不会更新。我是否需要手动更新子实体值或者是否有办法让EF自动执行此操作?
这里发送到网络API的例子PUT请求:
{
"$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和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; }
}
“...在控制器中更新数据库中船型的外键不会更新”。那么,你是否在船对象中传入了有效的船型ID?与您的问题无关:除了包含ID的船对象外,您为什么还要传入ID?似乎很奇怪。 – Sam
您是否在模型上定义了FK,即Boat是否包含名为BoatTypeID的属性以及BoatType的属性? – Sam
是的,上面显示的PUT中的1的BoatType Id是有效的。 – Danzig