在Entity Framework中获取最后添加的记录ID

时间:2014-01-30 23:40:25

标签: c# asp.net-mvc entity-framework

我正在我的数据库中注册一个新的客户端,当该操作完成时,我想显示该新客户端的详细信息视图。问题是我找不到向Details操作方法发送最近添加的客户端的ID的方法。

我正在处理这段代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(ClientModel credential)
{
    if(ModelState.IsValid)
    {
        database.Clients.Add(credential);
        database.SaveChanges();

        return RedirectToAction("Details", //Here is my problem, because sending credential.ID gives me an error as far as credential doesn't have an ID due it's not a database record.;
    }
    else
    {
        return View();
    }
}

这是mi ClientModel

[Table("Clients")]
public class ClientModel
{
    [Key]
    public Int16 ID { get; set; }

    [Required]
    public String Name { get; set; }

    public String Address { get; set; }

    [EmailAddress]
    public String EmailAddress { get; set; }

    [Phone]
    public String Phone { get; set; }

    public virtual ICollection<UserModel> Users { get; set; }
}

有人能为我的道路带来光明吗?

修改

得到了答案,我想讨论一下:

return RedirectToAction("Details", new { ID = credential.ID });

这个解决方案有效,但现在问题可能是,这是更好的解决方案,还是我应该在@ Basic的答案中使用2个类?

2 个答案:

答案 0 :(得分:8)

当您致电SaveChanges()credential.ID时,是否应填充数据库中的自动编号并在EF模型中设置。您可以尝试重新加载Entity Framework 4.1 DbSet Reload中提到的元素。

在上面的场景中,您要添加一个新客户端,因此您需要将客户端模型转换为客户端,如:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(ClientModel credential)
{
    var client = new Client
    {
       Name = model.Name,
       EmailAddress = model.EmailAddress,
       .
       .
    };

    db.Clients.Add(client);
    db.SaveChanges();

    model.ID = client.ID;

    return View(model);
}

然后ID将与模型一起返回。

答案 1 :(得分:4)

致电database.SaveChanges();后,模型上的ID字段将填入正确的ID。所以对你的问题的简单回答是......

Int16 NewId = credential.ID;

顺便说一句,除非您绝对肯定自己永远不需要处理超过32,767任何类型的记录,否则通常最好使用Int来表示所有ID字段(甚至Long) - 这样您就不需要记住哪些是Int16,哪些是Int。通过将某些Id字段的长度减半而节省的几个字节绝对可以忽略不计,除非您使用的是嵌入式系统。