2017-09-30 66 views
0

我需要实体框架的帮助。通过实体框架添加新项目后获取ID

控制器:

public ActionResult Create([Bind(Prefix = "visit")] visit visit, [Bind(Prefix = "drugsEdition")] IEnumerable<drugsEdition> drugsEdition, [Bind(Prefix = "accessoryEdition")] IEnumerable<accessoryEdition> accessoryEdition, [Bind(Prefix = "servicesEdition")] IEnumerable<servicesEdition> servicesEdition) 
{ 
    Models.VisitDetails visitDetails = new Models.VisitDetails(); 
    visitDetails.visit = visit; 

    if (ModelState.IsValid) 
    { 
     db.visit.Add(visit); 

     if (drugsEdition != null) 
     { 
      foreach (var item in drugsEdition) 
      { 
       item.idVisit = visit.id; 
       db.drugsEdition.Add(item); 
      } 
     } 

     if (accessoryEdition != null) 
     { 
      foreach (var item in accessoryEdition) 
      { 
       item.idVisit = visit.id; 
       db.accessoryEdition.Add(item); 
      } 
     } 

     if (servicesEdition != null) 
     { 
      foreach (var item in servicesEdition) 
      { 
       item.idVisit = visit.id; 
       db.servicesEdition.Add(item); 
      } 
     } 

     db.SaveChanges(); 

     return RedirectToAction("Details", new { id = visit.id }); 
    } 

    return View(visitDetails); 
} 

型号:

[Table("servicesEdition")] 
public partial class servicesEdition 
{ 
    public int id { get; set; } 

    public int idService { get; set; } 
    public int idVisit { get; set; } 
    public double priceSell { get; set; } 

    [ForeignKey("idService")] 
    public virtual services services { get; set; } 
} 

在这段代码中,我添加到数据库中一个新的访问,我希望得到参观的id代码行db.visit.Add (visit)后。当我添加新的drugsEdition和新accessoryEdition,此代码是正确的,并添加好idVisit,但是当我添加servicesEdition idVisit = 0.为什么'servicesEdition'没有得到好的idVisit?

+0

'ServicesEdition'类定义是怎么样的? – Shyju

回答

0

如果添加Visit类型的virtual导航性能,EF就会获得相应的访问ID,并填写在当它在你的SaveChanges方法调用节省了servicesEdition对象。

我还将外键属性重命名为VisitId,以便参照完整性按照约定(命名约定)工作,并且不需要明确使用ForeignKey属性。我也建议你使用PascalCasing编写C#类时(不一定需要为您的代码工作)

public partial class ServicesEdition 
{ 
    public int id { get; set; } 

    public int idService { get; set; } 

    public int VisitId { get; set; } 

    public virtual Visit Visit { get; set; } 

    public double priceSell { get; set; } 

    [ForeignKey("idService")] 
    public virtual services services { get; set; } 
} 

如果你不希望像我上述改变ServicesEdition实体定义,另一种选择是调用在添加访问实体后,您可以访问该ID的Id属性,然后使用SaveChanges()方法。

db.visit.Add(visit); 
db.SaveChanges(); 

var visitId = db.Id; 
//Now you can use visitId to save other entities 
+0

谢谢,实际上我在另一个班的'accessoryEdition'和'drugsEdition'中有虚拟访问但是我不知道实体之间有连接。 –

0

问题是db.visit.Add(visit);不生成ID,直到打db.SaveChanges();

你可以db.visit.Add(visit);后添加db.SaveChanges();。 或者您将保存为Shyju解释的图形。