我们正在使用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
答案 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