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