Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取实体框架中最后添加的记录ID_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

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();
    }
}
这是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; }
}

这个解决方案有效,但现在的问题可能是,这是更好的解决方案,还是我应该使用@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;