Asp.net core mvc 为什么实体框架用新的增量值替换提供的值
我正在努力完成一个点网络核心MVC项目,但我面临一个无法解决的问题。Asp.net core mvc 为什么实体框架用新的增量值替换提供的值,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我正在努力完成一个点网络核心MVC项目,但我面临一个无法解决的问题。 老实说,我不知道该搜索什么。 该项目是一个简单的车辆登记, 每辆车都有一个品牌、一个型号、一个品牌和一些特点。 以下是域模型: public class Make { public int Id { get; set; } public string Name { get; set; } public ICollection<Model> Models
老实说,我不知道该搜索什么。
该项目是一个简单的车辆登记, 每辆车都有一个品牌、一个型号、一个品牌和一些特点。 以下是域模型:
public class Make
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Model> Models { get; set; }
public Make()
{
Models=new Collection<Model>();
}
}
public class Model
{
public int Id { get; set; }
public string Name { get; set; }
public Make Make { get; set; }
public int MakeId { get; set; }
public Model()
{
Make=new Make();
}
}
public class Feature
{
public int Id { get; set; }
public string Name { get; set; }
}
[Table(name:"VehicleFeatures")]
public class VehicleFeature
{
public int VehicleId { get; set; }
public int FeatureId { get; set; }
public Feature Feature { get; set; }
public Vehicle Vehicle { get; set; }
public VehicleFeature()
{
Feature=new Feature();
Vehicle=new Vehicle();
}
}
public class Vehicle
{
public int Id { get; set; }
public Model Model { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ModelId { get; set; }
public ICollection<VehicleFeature> VehicleFeatures { get; set; }
public string ContactName { get; set; }
public string ContactPhone { get; set; }
public string ContactEmail { get; set; }
public DateTime LastUpdate { get; set; }
public bool IsRegistered { get; set; }
public Vehicle()
{
Model=new Model();
VehicleFeatures=new Collection<VehicleFeature>();
}
}
事情就是这样:控制器接收到正确的值, 将正确的值添加到上下文中, 然后突然间,所有的地狱都消失了。 这是控制器代码:
[HttpPost]
public async Task<IActionResult> CreateVehicle([FromBody] Vehicle v)
{
context.Vehicles.Add(v);
await context.SaveChangesAsync();
return Ok(v.ModelId);
}
[HttpPost]
公共异步任务CreateVehicle([FromBody]Vehicle v)
{
上下文。车辆。添加(v);
wait context.saveChangesSync();
返回Ok(v.ModelId);
}
我在这里遗漏了什么?为什么要将
新车型()
分配给Vehlcle.Model
?@CodeCaster通过访问/分配车辆模型而不首先初始化,以防止发生空参考异常。我做错了吗?这是您认为的原因吗?我认为您的new Model()
覆盖了提供的ModelId
,导致EF插入一个新模型并将其主键(为1)分配给ModelId
。请尝试将null
分配给车辆。改用Model
,或将其状态设置为unchanged,或创建新车型{Id=10}
。根据经验,切勿初始化参考导航属性。请看,EF Core在这方面没有什么不同。@CodeCaster是正确的。通过设置导航属性,您告诉EF创建一个新的模型
,然后由于您还将其与车辆关联,EF必须使用新的模型
id回填模型id
,以维护关系。
[HttpPost]
public async Task<IActionResult> CreateVehicle([FromBody] Vehicle v)
{
context.Vehicles.Add(v);
await context.SaveChangesAsync();
return Ok(v.ModelId);
}