我正在我的数据库中注册一个新的客户端,当该操作完成时,我想显示该新客户端的详细信息视图。问题是我找不到向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个类?
答案 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字段的长度减半而节省的几个字节绝对可以忽略不计,除非您使用的是嵌入式系统。