2011-03-06 90 views
407

我在Asp.net中遇到了實體框架問題。無論何時將對象添加到數據庫,我都想獲取Id值。我怎樣才能做到這一點?如何獲取實體框架中插入實體的ID?

+11

由拉吉斯拉夫Mrnka答案是正確的答案,並應接受這樣的。 – 2016-05-17 07:40:43

+1

OP只會用他/她的賬戶發佈一次,這個問題要更具體一些。這給了他/她幾乎2K的聲望(!),答案沒有被標記爲接受,因爲該賬戶自那一天起被放棄。 – MurariAlex 2017-09-15 19:48:18

回答

8

在將更改傳播到數據庫後,要保存的對象應具有正確的Id

+0

我們這樣的錯誤「而更新entires錯誤occurued。詳情請參閱內部異常」 – ahmet 2011-03-06 19:37:37

+25

你見過的內部異常? ;-) – Snowbear 2011-03-06 20:02:00

691

這很簡單。如果您使用數據庫生成的ID(例如MS SQL中的IDENTITY),則只需將實體添加到相關的ObjectContext上的ObjectSetSaveChanges即可。 Id會自動填寫你:

using (var context = new MyContext()) 
{ 
    context.MyEntities.AddObject(myNewObject); 
    context.SaveChanges(); 

    int id = myNewObject.Id; // Yes it's here 
} 

默認實體框架遵循每個INSERTSELECT SCOPE_IDENTITY()當使用自動生成的Id秒。

+30

所以你問錯了問題。如果您遇到異常問題,您應該提問顯示您的異常(以及內部異常)和導致該錯誤的代碼段。 – 2011-03-06 20:09:01

+1

請確保您添加的實體是一個有效的實體例如,用「不空」數據庫的限制,仍必須填寫等 – fran 2011-06-03 09:35:44

+1

@LadislavMrnka:關於新創建的對象的導航屬性是什麼?保存更改後,它們似乎不會自動填充。 – 2014-11-11 18:21:15

18

您需要在savechanges後重新加載實體。因爲它已被EF無法跟蹤的數據庫觸發器更改。因此,我們需要從數據庫重新載入實體,

db.Entry(MyNewObject).GetDatabaseValues(); 

然後

int id = myNewObject.Id; 

請看下面的問題@jayantha答案:

How can I get Id of inserted entity in Entity framework when using defaultValue?

+1

嗨,當我這樣做,我得到的編譯錯誤,說:無法解析屬性,例如ID或名稱,你能幫助我嗎? – 2014-10-17 05:41:27

+0

@MortezaAzizi這似乎是沒有處理或空屬性問題的錯誤,但你可以請更多的解釋或寫一些代碼片段? – QMaster 2014-10-18 08:54:29

1

我遇到的情況我需要在數據庫中插入數據&同時需要使用實體框架的主ID。 解決方案:

long id; 
IGenericQueryRepository<myentityclass, Entityname> InfoBase = null; 
try 
{ 
    InfoBase = new GenericQueryRepository<myentityclass, Entityname>(); 
    InfoBase.Add(generalinfo); 
    InfoBase.Context.SaveChanges(); 
    id = entityclassobj.ID; 
    return id; 
} 
4
Repository.addorupdate(entity, entity.id); 
Repository.savechanges(); 
Var id = entity.id; 

這將工作。

+1

版本庫不負責將更改保存到數據庫中。這是UnitOfWork的工作。 – tchelidze 2017-11-11 10:55:32

37

我一直在使用Ladislav Mrnka's answer在使用實體框架時成功檢索ID,但是由於我一直錯過使用它(即在不需要它的地方使用它),並且認爲我會在此發佈我的發現在這種情況下,人們正在尋求「解決」我所遇到的問題。

考慮與客戶具有外鍵關係的訂單對象。當我在同一時間添加新客戶和新訂單時,我正在做這樣的事情;

var customer = new Customer(); //no Id yet; 
var order = new Order(); //requires Customer.Id to link it to customer; 
context.Customers.Add(customer); 
context.SaveChanges();//this generates the Id for customer 
order.CustomerId = customer.Id;//finally I can set the Id 

但在我的情況下,這不是必需的,因爲我有customer.Id和訂單之間的外鍵關係。客戶編號

我所要做的就是這一點;

var customer = new Customer(); //no Id yet; 
var order = new Order{Customer = customer}; 
context.SaveChanges();//adds customer.Id to customer and the correct CustomerId to order 

現在,當我保存更改時,爲客戶生成的ID也會添加到訂單中。我已經不再需要額外的步驟

我知道這並不能回答原來的問題,但認爲它可能幫助開發誰是新的EF過度使用得票最多的答案的東西,可能不需要。

+2

謝謝!重要最佳實踐提示:var order = new Order {Customer = customer};這顯示了Entity Framework分配相關對象的強大功能,並且Id將自動更新。 – 2017-07-09 19:06:17

+0

感謝您特別指出這一點。我正在做默認的。爲此+1 – user2695433 2017-09-19 05:33:51

3

只能保存後得到的ID,而不是你可以創建一個新的GUID和保存之前分配。

0

當您使用EF 6.x的代碼首先

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

並初始化數據庫表,就會把一個

(newsequentialid()) 

表格屬性裏面的頭默認值,或綁定下,允許該ID在插入時填充。

的問題是,如果你創建一個表,並在以後添加

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

一部分,未來的更新數據庫將不會加回(NEWSEQUENTIALID())

要解決的正確方法是擦除遷移,刪除數據庫並重新遷移......或者您可以將(newsequentialid())添加到表設計器中。下面