2012-04-11 47 views
0

我有以下类:插入/更新多个对象

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

它打破了“分贝。 SaveChanges'因为它说'不能在对象'dbo.Car'中插入重复键''。

如果我删除'db.Location.Add(locacao);',所以它适用于汽车(插入和更新),但没有位置被添加到数据库中。

当数据库中没有汽车ID时,如何插入新车,何时更新以及插入新位置?

回答

1

Add方法总是添加对象图中的所有实体,因此db.Car.Add(location.Car)db.Location.Add(location)都插入位置和汽车。

试试这个:

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(); 
+0

完美!非常感谢。 – MuriloKunze 2012-04-11 12:29:58