插入/更新多个对象

时间:2012-04-11 11:50:00

标签: entity-framework

我有以下课程:

public class Location
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string CarId { get; set; } 
    public Car Car { get; set; }
}

public class Car
{
    public string Id { get; set; }
    public string Color { get; set; } 
}

观点:

    <div>@Html.LabelFor(location => location.Description)</div>
    <div>@Html.EditorFor(location => location.Description)</div>

    <div>@Html.LabelFor(location => location.Car.Id)</div>
    <div>@Html.EditorFor(location => location.Car.Id)</div>

    <div>@Html.LabelFor(location => location.Car.Color)</div>
    <div>@Html.EditorFor(location => location.Car.Color)</div>

当我尝试这个时:

    [HttpPost]
    public ActionResult Create(Location location)
    {
        if (ModelState.IsValid) 
        {
            Car car = db.Car.Find(location.Car.Id);

            if (car != null)
                db.Entry(car).CurrentValues.SetValues(location.Car);
            else
                db.Car.Add(location.Car);

            db.Location.Add(locacao);
            db.SaveChanges();  

            return RedirectToAction("Index");
        }

        return View(locacao);
    }

它在'db.SaveChanges'中断,因为它说'无法在对象'dbo.Car中插入重复键'。'

如果我删除'db.Location.Add(locacao);',那么它对于汽车(插入和更新)工作得很好,但在数据库中没有添加任何位置。

如果数据库中没有汽车ID,如何更新,并插入新位置,我该如何插入新车?

1 个答案:

答案 0 :(得分:1)

Add方法始终在对象图中添加所有实体,因此db.Car.Add(location.Car)db.Location.Add(location)都插入了location和car。

试试这个:

db.Location.Add(locacation);
// You can also use another way to find if you are working with a new Car 
// like location.Car.Id == 0
if (db.Car.Any(c => c.Id == location.Car.Id)) 
{
    db.Entry(location.Car).State = EntityState.Modified;
}
db.SaveChanges();