Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 当实体映射到存储过程时,如何在调用SaveChanges()后获取该实体的标识_C#_.net_Sql Server_Entity Framework_Entity Framework 4 - Fatal编程技术网

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

C# 当实体映射到存储过程时,如何在调用SaveChanges()后获取该实体的标识,c#,.net,sql-server,entity-framework,entity-framework-4,C#,.net,Sql Server,Entity Framework,Entity Framework 4,我们使用的是EntityFramework4.0,我们有一个映射到DBA提供的存储过程的实体。映射详细信息中的Insert、Update和Delete函数都有自己的存储过程 当使用映射到表的实体时,我可以添加一个新实体,调用dataContext.SaveChanges()

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

当使用映射到表的实体时,我可以添加一个新实体,调用
dataContext.SaveChanges()
当实体映射到存储过程时,如何实现这一点?INSERT存储过程是否必须在
dataContext.SaveChanges()上执行一些特殊操作和/或我是否必须在
dataContext.SaveChanges()上执行一些特殊操作

例子 传统方式 映射到存储过程。
我相信您的DB需要使用
@@identity
或使用
NewID()
插入,并通过存储过程将identity/NewID值返回给您。从技术上讲,您可以从数据库中为插入的记录进行选择,但这是一种非常值得怀疑的方法;您不知道是否插入了记录(除非SP在.Net上失败),您可能不知道是否存在重复的记录,甚至不知道数据是否在插入后但在选择之前发生了更改。如果有疑问,我总是强烈建议您与DBA讨论基于DBA设计的特定需求的最佳方法

更新:

如果他返回PK值,您应该能够从表中进行标准选择,以填充实体,如context.entities中的e
,其中e.pkcolumn=spkeyreturned选择e


如果他将所有数据返回给您,并且可以保证数据不会更改,则您可以创建一个新实体,填充该实体并使用Attach方法。我个人不会这么做,但这是一个选择

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

SELECT Scope_Identity() AS Id
调用
后插入


还要确保实体模式中的PK正确配置为
StoreGeneratedPattern
设置为
Identity
(如果使用数据库更新,应自动设置)

这很好,但即使他返回我需要的数据,我仍然不知道如何用它填充我的实体,而且我没有主键来查询实体,因为主键还没有在我这边填充。肯定比
@@identity
好。
var newCustomer = new Customer
{
    Name = "Fred",
    Age = 24
};

// newCustomer.Id is null

dataContext.Customers.Add(newCustomer);
dataContext.SaveChanges()

// newCustomer.Id is null
SELECT Scope_Identity() AS Id