当实体映射到存储过程时,如何在调用SaveChanges()后获取实体的标识

本文关键字:实体 SaveChanges 获取 标识 调用 存储过程 映射 | 更新日期: 2023-09-27 18:11:03

我们正在使用实体框架4.0,我们有一个实体映射到我们的DBA提供的存储过程。映射详细信息中的Insert、Update和Delete函数都有自己的存储过程。

当使用映射到表的实体时,我可以添加一个新实体,调用dataContext.SaveChanges();,然后我实例化的新实体自动使用数据库中identity列的值填充其ID属性。

当实体映射到存储过程时,这是如何完成的?INSERT存储过程是否必须做一些特殊的事情,或者我是否必须在dataContext.SaveChanges();上做一些特殊的事情?

传统方式
var newCustomer = new Customer
{
    Name = "Fred",
    Age = 24
};
// newCustomer.Id is null
dataContext.Customers.Add(newCustomer);
dataContext.SaveChanges()
// newCustomer.Id is what database identity column was set to.

映射到存储过程。

var newCustomer = new Customer
{
    Name = "Fred",
    Age = 24
};
// newCustomer.Id is null
dataContext.Customers.Add(newCustomer);
dataContext.SaveChanges()
// newCustomer.Id is null

当实体映射到存储过程时,如何在调用SaveChanges()后获取实体的标识

如果您在数据库中使用Identity列,请确保您的存储过程包含:

SELECT Scope_Identity() AS Id

呼叫INSERT

还要确保您的实体模式中的PK正确配置StoreGeneratedPattern设置为Identity(如果您使用Update from database应该自动)

我相信您的DB需要使用@@identity或插入NewID()并通过存储过程将Identity/NewID值返回给您。从技术上讲,你可以从数据库中选择你插入的记录,但这是一个非常有问题的方式;您不知道是否插入了记录(除非SP在. net中失败),您可能不知道是否存在重复的记录,甚至不知道在插入之后但在选择之前是否更改了数据。当有疑问时,我总是强烈建议与您的DBA讨论基于您的DBA设计的满足您特定需求的最佳方法。

更新:

如果他返回给您PK值,您应该能够从表中执行标准选择来填充实体,如from e in context.entities where e.pkcolumn = spkeyreturned select e

如果他返回给你所有的数据,并且可以保证数据不会改变,你可以创建一个新的实体,填充所有的数据,并使用Attach方法。我个人不会这么做,但这是一个选择。实体框架中对象的附加和分离。