Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Sql 附加类型为的实体失败,因为相同类型的另一个实体已具有相同的主键值。实体框架的例外情况_Sql_Entity Framework - Fatal编程技术网

Sql 附加类型为的实体失败,因为相同类型的另一个实体已具有相同的主键值。实体框架的例外情况

Sql 附加类型为的实体失败,因为相同类型的另一个实体已具有相同的主键值。实体框架的例外情况,sql,entity-framework,Sql,Entity Framework,我使用此控制器更新数据库中的信息: public ActionResult EditOwner(Owner owner, int? [] selectedNewCars) { var newOwner = new Owner(); newOwner.Name = owner.Name; newOwner.Surname = owner.Surname; newOwner.Birthday = owner.Birthday;

我使用此控制器更新数据库中的信息:

public ActionResult EditOwner(Owner owner, int? [] selectedNewCars)
{
        var newOwner = new Owner();

        newOwner.Name = owner.Name;
        newOwner.Surname = owner.Surname;
        newOwner.Birthday = owner.Birthday;
        newOwner.ExperienceInYears = owner.ExperienceInYears;
        newOwner.OwnerId = owner.OwnerId;

        newOwner.Cars.Clear();

        if (selectedNewCars != null)
        {                
            foreach (int carId in selectedNewCars)
            {
                var car = db.GetCar(carId);
                newOwner.Cars.Add(car);
            }                          
        }

        db.UpdateOwner(newOwner);

        return RedirectToAction("OwnersInfo");
}
要从repository类更新条目,请执行以下操作:

public void UpdateOwner(Owner item)
{            
        db.Entry(item).State = EntityState.Modified;
        Save();
}
凭身份证取车:

public Car GetCar(int id)
{           
    return db.Cars.Include(p => p.Owners).FirstOrDefault(x => x.CarId == id);
}
车型:

    public class Car
{
    [HiddenInput(DisplayValue = false)]
    public int CarId { get; set; }

    [Required]
    [Display(Name = "Car model")]
    public string Model { get; set; }

    [Required]
    [Display(Name = "Car mk.")]
    public string Mk { get; set; }

    [Required]
    [Display(Name = "Car price")]
    [DataType(DataType.Currency)]
    public double Price { get; set; }

    [Required]
    [Display(Name = "Release Date")]
    public int ReleaseDate { get; set; }        

    [Required]
    [Display(Name = "Car type")]
    public CarType Type { get; set; }

    [HiddenInput(DisplayValue = false)]
    public List<Owner> Owners { get; }

    public Car()
    {
        Owners = new List<Owner>();          
    }
}
公车
{
[HiddenInput(DisplayValue=false)]
public int CarId{get;set;}
[必需]
[显示(名称=“车型”)]
公共字符串模型{get;set;}
[必需]
[显示(Name=“Car mk.”]
公共字符串Mk{get;set;}
[必需]
[显示(名称=“汽车价格”)]
[数据类型(数据类型.货币)]
公共双价{get;set;}
[必需]
[显示(Name=“发布日期”)]
public int ReleaseDate{get;set;}
[必需]
[显示(名称=“车辆类型”)]
公共CarType类型{get;set;}
[HiddenInput(DisplayValue=false)]
公共列表所有者{get;}
公共汽车
{
所有者=新列表();
}
}
所有者模型:

public class Owner
{
    [HiddenInput(DisplayValue = false)]
    public int OwnerId { get; set; }

    [Required]
    [Display(Name = "Client name")]
    public string Name { get; set; }

    [Required]
    [Display(Name = "Client surname")]
    public string Surname { get; set; }

    [Required]
    [Display(Name = "Client birthday")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime Birthday { get; set; }

    [Required]
    [Display(Name = "Client experience(in years)")]
    public int? ExperienceInYears { get; set; }

    [Display(Name = "Select car")]      
    public List<Car> Cars { get; set; }

    public Owner()
    {
        Cars = new List<Car>();
    }
}
公共类所有者
{
[HiddenInput(DisplayValue=false)]
public int OwnerId{get;set;}
[必需]
[显示(Name=“客户名称”)]
公共字符串名称{get;set;}
[必需]
[显示(Name=“客户姓氏”)]
公共字符串姓氏{get;set;}
[必需]
[显示(Name=“客户生日”)]
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:yyyy-MM-dd}”,ApplyFormatInEditMode=true)]
公共日期时间生日{get;set;}
[必需]
[显示(Name=“客户经验(年)”)]
public int?ExperienceInYears{get;set;}
[显示(Name=“选择车辆”)]
公共列表车辆{get;set;}
公共所有者()
{
Cars=新列表();
}
}
我的问题是EF的这个例外:

有人能帮忙吗?我花了几天的时间试图解决它,但什么也没发现。

我发现了一个问题。必须从数据库接收“所有者”对象,然后进行修改,如下所示:

    public ActionResult EditOwner(Owner owner, int? [] selectedNewCars)
    {
        var newOwner = db.GetOwner(owner.OwnerId);

        newOwner.Name = owner.Name;
        newOwner.Surname = owner.Surname;
        newOwner.Birthday = owner.Birthday;
        newOwner.ExperienceInYears = owner.ExperienceInYears;
        newOwner.OwnerId = owner.OwnerId;

        newOwner.Cars.Clear();

        if (selectedNewCars != null)
        {                
            foreach (int carId in selectedNewCars)
            {
                var car = db.GetCar(carId);                    
                newOwner.Cars.Add(car);
            }                          
        }

        db.UpdateOwner(newOwner);

        return RedirectToAction("OwnersInfo");
    }

嗨,Oleksiy,你介意分享一下数据库中车主和汽车表之间的关系吗?在我看来,当你从db检索一辆车时,你也包括车主。然后你把那辆车添加到新的车主身上。对我来说,它看起来像汽车。车主已经拥有具有相同id的车主ojbect,这可能是导致此异常的原因。这里的问题是,您仅在一个实体上设置了“修改”…您是否尝试将汽车实体上的“修改”设置为“已修改”?谢谢回答!我正在按照你说的做这件事,但当我尝试创建条目时,这很好,我认为这必须与更新一起工作,但没有。。if(selectedCars!=null){foreach(selectedCars中的int carId){var car=db.GetCar(carId);newOwner.Cars.Add(car);}