Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core mvc 为什么实体框架用新的增量值替换提供的值_Asp.net Core Mvc_Entity Framework Core - Fatal编程技术网

Asp.net core 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

我正在努力完成一个点网络核心MVC项目,但我面临一个无法解决的问题。
老实说,我不知道该搜索什么。
该项目是一个简单的车辆登记, 每辆车都有一个品牌、一个型号、一个品牌和一些特点。 以下是域模型:

    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);
        }