2012-07-13 103 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