2011-03-28 138 views
0

实体框架4返回键/主键实体框架4返回键/主键

我试图找到一种方法,返回键/主键,而无需创建一个存储过程来为我做使用:

CREATE PROCEDURE [dbo].[UserRecords] 
(
    @Name varchar(10) 
) AS 

-- INSERT the new record 
INSERT INTO MyTable (Name) 
VALUES(@Name) 

-- Now return the InventoryID of the newly inserted record 
SELECT SCOPE_IDENTITY() AS ID 

虽然Visual Studio 2010中我则使用添加功能导入从模型浏览器,并创建一个复杂类型。

然后虽然C#我使用下面的代码来检查它的工作。

SQL_DB_Entities DB= new SQL_DB_Entities(); 
      var ReturnValue = DB.UserRecords("BOB").First(); 
      Console.Write(ReturnValue.ID); 
      Console.Read(); 

我只是在寻找一种更好的方式返回ID也被不会很肯定IM引起的头痛为自己拉斯特上走下赛场。

如果您觉得这不是返回密钥的最佳方式,请告诉我。

我已经尝试过这种方式,但返回0

SQL_DB_Entities DB = new SQL_DB_Entities(); 
User UserObject = new User{Name = “BOB”}; 
DB.AddToUserTable(UserObject); 
DB.SaveChanges(): 
Int key = UserObject.ID; 
Console.WriteLine(key.ToString()); 

我还要提到的是,db是主键不是我的申请后看。

+0

从内存EF通常会选择/返回插入的对象,包括PK。我不知道为什么你没有得到它,如果这是明确获得PK的正确方法。你为什么需要它? – JTew 2011-03-28 01:57:36

+1

最后一个例子必须工作。如果它不是你配置错误的东西。 – 2011-03-28 06:58:24

+0

@Ladislav和@Ben你的100%正确,非常感谢你的帮助。 – Ches 2011-03-28 11:44:28

回答

1

如果您在实体中正确设置了StoreGeneratedPatternIdentity,并且您已经在数据库中自动生成PK,则在每次保存更改后,EF将填充插入实体的ID。检查this article以了解商店生成的模式。

+0

所有工作正常,但返回刚刚插入的记录的ID似乎是问题。我有StoreGeneratedPattern设置为标识。这是自动通过Visual Studio从数据库更新模型。 – Ches 2011-03-28 11:03:34

+0

@Ches:现在我没有失望。你说它工作正常,但它会导致一个问题。你可以通过SQL Profiler执行什么语句吗? – 2011-03-28 11:07:57

+0

我的问题没有插入数据到表中,我插入数据后直接返回ID。现在抓住SQL Profiler的详细信息。 – Ches 2011-03-28 11:20:40

0

通常的方法是将模型中PK列的StoreGeneratedPattern属性设置为标识。或者,如果您使用的代码优先,注释属性搭配:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

我不知道这是否可与存储过程,虽然。顺便说一句,你在这种情况下使用sprocs的任何特殊原因?

+0

Entity Frame发现我在表中有一个主键并用它作为标识。所以这一直工作。 – Ches 2011-03-28 03:20:32

+0

只有使用Sprocs作为唯一的方式,我可以在插入 – Ches 2011-03-28 03:40:46

+0

@Ches后返回密钥。不,使用sprocs不是唯一的方法。在您的数据库中,将列标记为标识,然后将模型中同一列的StoreGeneratedPattern属性设置为标识。实体框架将完成剩下的工作。我一直都在做这种善意的事情,而且没有看到任何问题。 – Ben 2011-03-28 07:58:12

0

正常情况下,PK作为EF对象EntityKey上的特定属性处理。你可能最好看看EntityKeys。