2012-07-13 104 views
0

我只是在设计一个Web服务,因此我没有实际的代码,但这可能会影响数据库和应用程序设计。C#ADO.NET确定新自动递增主键的值?

我打算有一个数据库表(在SQL Server中),它将有一个类型为bigint的主键,它是自动增量的。现在我假设在ADO.NET中,当向表中添加新记录时,我不会设置此字段。我需要知道的是,我将如何知道刚添加的ID是什么。当然,我可以在该字段上选择MAX,但ADO.NET实际上是否返回新ID的值,从而节省了开销?

举例来说,如果我有一些像这样的代码:

using (MyEntities context = new MyEntities()) 
{ 
    context.Table1.AddObject(new Table1() 
    { 
     StringColumn1 = "some value", 
     StringColumn2 = "some value" 
    }); 

    context.SaveChanges(); 
} 

如果有表1中的一个自动增量PK叫ID,我怎么知道刚刚添加的价值?

+1

这是使用实体框架?如果是这样:当你插入时,EF应该照顾自动更新这些ID。如果您使用的是原始ADO.NET,请查看使用INSERT语句的OUTPUT子句,或者查看SCOPE_IDENTITY()在INSERT后面调用(在同一个SQL批处理中) – 2012-07-13 10:30:32

+0

是的,我正在使用EF。 @marc_s - 我知道它会这样做。这不是问题。我怎么知道这个价值是什么? – Jonnster 2012-07-13 10:31:28

+1

您需要保留对要插入的对象的引用,然后在调用'.SaveChanges()'后,可以从该对象中读出'ID'属性。 – 2012-07-13 10:32:25

回答

1

如果没记错的话我实现这种方式,因为EF与获得ID为您

using (MyEntities context = new MyEntities()) 
{ 
var table1 = new Table1() 
{ 
     StringColumn1 = "some value", 
     StringColumn2 = "some value" 
}; 

    context.Table1.AddObject(table1); 

    context.SaveChanges(); 

int id = table1.Id; 
} 
+0

感谢。所以EF实际上会为我填写ID。 – Jonnster 2012-07-13 10:43:24

+0

@Jonnster是的,它会很抱歉输入很快,所以可以恢复工作 – HatSoft 2012-07-13 10:49:44

2

使用实体框架,这是自动的为你全部搞定:

using (MyEntities context = new MyEntities()) 
{ 
    var myNewObject = new Table1() 
    { 
     StringColumn1 = "some value", 
     StringColumn2 = "some value" 
    }); 

    context.Table1.AddObject(myNewObject); 

    context.SaveChanges(); 

    // get the new ID 
    var newID = myNewObject.ID; 
} 

保存在实体框架将自动更新“自增” ID列,并且您调用.SaveChanges()后仅读出来...

+1

如果要创建自己的模型(而不是从数据库中生成它)我想你可能还需要设置'StoreGeneratedPattern'到'Identity' – paul 2012-07-13 10:40:33