C# 获取实体框架中最后添加的记录ID
我正在数据库中注册一个新的客户机,当该操作完成时,我想显示该新客户机的详细视图。问题是我没有找到将最近添加的客户端的C# 获取实体框架中最后添加的记录ID,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在数据库中注册一个新的客户机,当该操作完成时,我想显示该新客户机的详细视图。问题是我没有找到将最近添加的客户端的ID发送到Details操作方法的方法 我正在编写以下代码: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(ClientModel credential) { if(ModelState.IsValid) { database.Clients.Add(creden
ID
发送到Details
操作方法的方法
我正在编写以下代码:
[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();
}
}
这是miClientModel
:
[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; }
}
这个解决方案有效,但现在的问题可能是,这是更好的解决方案,还是我应该使用@Basic的答案中评论的2个类?当您调用
SaveChanges()
,credential.ID
,如果数据库中的自动编号和EF模型中的设置应该填充。您可以尝试重新加载中提到的元素
在上面的场景中,您正在添加一个新客户机,因此需要将客户机模型转换为客户机模型,如下所示:
[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将随模型一起返回。一旦调用
database.SaveChanges()
,模型上的ID
字段将填充正确的ID。因此,您的问题的简单答案是
Int16 NewId = credential.ID;
另一方面,除非您绝对确定您永远不需要处理任何类型的超过32767个记录,否则您通常最好对所有Id字段使用
Int
(甚至Long
)——这样您就不需要记住哪些是Int16
,哪些是Int
。将某些Id字段的长度减半所节省的几个字节是完全可以忽略的,除非您是在嵌入式系统上。事实上,凭证没有和Id,因为它们的值是从没有Id字段要完成的注册表中获取的,因为这是数据库的工作。这可能是问题所在吗?对于此值,我是否应该使用其他模型?编辑:我已经在上面添加了模型。哦,我看到了,上面更新了。请检查我对@BasicKeep Client和ClientModel答案的最后评论。ClientModel应该从EF生成,ClientModel将包含您需要的属性,并应用必要的MVC属性(显示、验证等)。因此,客户机是一个数据传输对象(DTO模式)。按照我上面的方法,它会起作用的。你能为我完成方法标题来澄清你的答案吗?仅仅使用客户端
而不是客户端模型
不是更好的选择?我可以向数据库发送一个客户机,让Entity Framework识别出应该是一个ID为的客户机,添加它并返回一个ClientModel
类?因此参数应该是Client-Client
,而不是ClientModel-credential
。那么我应该向Detais
方法发送什么呢?credential.ID、NewId,还是应该在数据库中搜索添加的项目?信息:很抱歉给您带来不便,但我是这方面的新手。在过去的两周里,我一直在看教程和阅读评论。好的,应该是这样的。。。您创建了一个没有指定标识的新模型。将其添加到上下文中相应的表中,然后调用SaveChanges()
<代码>保存更改()将记录存储在数据库中。在此过程中,数据库会自动为其分配一个Id。实体框架意识到您拥有的本地副本已过期,并从数据库中更新它,包括新的Id
。然后使用Id字段进行重定向。在我的示例中,NewId
和credential.ID
应该是相同的。如果没有发生这种情况,则EF设置或DB设置有问题。请使用SQL Management Studio查看数据库表。ID字段是否设置为自动递增?手动插入记录(使用SMS)是否会自动分配ID?因此,我是否应该创建一个客户端
类,作为在应用程序内部工作的ClientModel
类的无ID副本,让-Model类仅由框架使用。这样做也许我应该让ClientModel
继承自Client
,我错了吗?您可以让类彼此继承,但没有必要。您创建了模型的一个实例,只是不设置Id的值。您可以调用SaveChanges()
。该Id现在已填充到您刚刚创建的模型实例上。不是同一个问题,但无论如何都很有用。我99%确定它是同一个问题,或者我误解了您的问题。作为一个更明确的例子,看看哪一个说的是相同的。当然,我可能误解了你的意思——在这种情况下,你能澄清为什么你的问题不同吗?谢谢另外,没有必要为不理解而道歉(你对我答案的评论)。我们一开始什么都不知道。我同意@Basic。这两个问题我都读了三遍,看不出有什么不同。如果你确信他们是,请解释。现在,我投票将它标记为一个复制品。它不是一个复制品,因为那里的答案不能解决我的问题,就像他们在这里做你所有的评论和答案一样。因此,这个问题要么不一样,要么不能以同样的方式解决。
Int16 NewId = credential.ID;