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

时间:2011-10-11 19:04:09

标签: c# .net sql-server entity-framework entity-framework-4

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

当使用映射到表的实体时,我能够添加一个新实体,调用dataContext.SaveChanges();,然后我自动实例化的新实体的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

2 个答案:

答案 0 :(得分:9)

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

SELECT Scope_Identity() AS Id

致电INSERT

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

答案 1 :(得分:1)

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

更新

如果他给你返回PK值,你应该能够从表中做一个标准选择来填充像from e in context.entities where e.pkcolumn = spkeyreturned select e这样的实体。

如果他返回所有数据,并且可以保证数据不会改变,您可以创建一个新实体,填充它将所有数据并使用Attach方法。我个人不会那样做,但这是一个选择。 Attaching and Detaching Object in Entity Framework