我在Asp.net中遇到了實體框架問題。無論何時將對象添加到數據庫,我都想獲取Id值。我怎樣才能做到這一點?如何獲取實體框架中插入實體的ID?
回答
這很簡單。如果您使用數據庫生成的ID(例如MS SQL中的IDENTITY
),則只需將實體添加到相關的ObjectContext
上的ObjectSet
和SaveChanges
即可。 Id
會自動填寫你:
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Yes it's here
}
默認實體框架遵循每個INSERT
與SELECT SCOPE_IDENTITY()
當使用自動生成的Id
秒。
所以你問錯了問題。如果您遇到異常問題,您應該提問顯示您的異常(以及內部異常)和導致該錯誤的代碼段。 – 2011-03-06 20:09:01
請確保您添加的實體是一個有效的實體例如,用「不空」數據庫的限制,仍必須填寫等 – fran 2011-06-03 09:35:44
@LadislavMrnka:關於新創建的對象的導航屬性是什麼?保存更改後,它們似乎不會自動填充。 – 2014-11-11 18:21:15
請參閱此鏈接。
http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/
你必須StoreGeneratedPattern的屬性設置爲身份,然後嘗試自己的代碼。
否則你也可以使用它。
using (var context = new MyContext())
{
context.MyEntities.AddObject(myNewObject);
context.SaveChanges();
int id = myNewObject.Id; // Your Identity column ID
}
與頂部投票答案相同。 – Lewis86 2018-02-22 17:56:53
您需要在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?
嗨,當我這樣做,我得到的編譯錯誤,說:無法解析屬性,例如ID或名稱,你能幫助我嗎? – 2014-10-17 05:41:27
@MortezaAzizi這似乎是沒有處理或空屬性問題的錯誤,但你可以請更多的解釋或寫一些代碼片段? – QMaster 2014-10-18 08:54:29
我遇到的情況我需要在數據庫中插入數據&同時需要使用實體框架的主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;
}
Repository.addorupdate(entity, entity.id);
Repository.savechanges();
Var id = entity.id;
這將工作。
版本庫不負責將更改保存到數據庫中。這是UnitOfWork的工作。 – tchelidze 2017-11-11 10:55:32
我一直在使用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過度使用得票最多的答案的東西,可能不需要。
謝謝!重要最佳實踐提示:var order = new Order {Customer = customer};這顯示了Entity Framework分配相關對象的強大功能,並且Id將自動更新。 – 2017-07-09 19:06:17
感謝您特別指出這一點。我正在做默認的。爲此+1 – user2695433 2017-09-19 05:33:51
只能保存後得到的ID,而不是你可以創建一個新的GUID和保存之前分配。
當您使用EF 6.x的代碼首先
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
並初始化數據庫表,就會把一個
(newsequentialid())
表格屬性裏面的頭默認值,或綁定下,允許該ID在插入時填充。
的問題是,如果你創建一個表,並在以後添加
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
一部分,未來的更新數據庫將不會加回(NEWSEQUENTIALID())
要解決的正確方法是擦除遷移,刪除數據庫並重新遷移......或者您可以將(newsequentialid())添加到表設計器中。下面
- 1. 如何使用實體框架獲取上次插入的ID
- 2. 如何使用實體框架插入並獲取PK ID?
- 3. 實體框架在foreach中獲取多個插入的ID
- 4. 實體框架插入子實體
- 5. 實體框架插入新實體
- 6. 插入後在實體框架中獲取記錄ID
- 7. 實體框架 - 按ID插入
- 8. 獲取datomic中插入實體的ID?
- 9. 實體框架4獲取插入記錄的主鍵ID
- 10. 獲取最近創建的實體的ID - ADO實體框架
- 11. 實體框架:獲取相關實體
- 12. 從實體框架中的父實體獲取子實體c#
- 13. C#實體框架,獲取插入ID(通用)
- 14. 實體框架LINQ插入
- 15. C# - 實體框架插入
- 16. 實體框架應插入
- 17. 實體框架:表插入
- 18. 獲取ID值與實體框架
- 19. 從實體框架獲取項目ID
- 20. 實體框架:當實體ID的SaveChanges
- 21. 實體框架插入錯誤的實體插入的SaveChanges
- 22. 如何使用實體框架從mysql中獲取最後插入的ID
- 23. 如何在使用defaultValue時在Entity框架中獲取插入實體的Id?
- 24. 如何阻止實體框架插入關聯的實體?
- 25. 實體框架如何插入新值?
- 26. 如何將實體框架插入ntext?
- 27. 實體框架獲取具有子實體的實體
- 28. 實體框架1 - 如何插入涉及導航實體
- 29. 與實體框架獲取
- 30. 組合框和實體框架,如何獲取ID? (WPF-MVVM)
由拉吉斯拉夫Mrnka答案是正確的答案,並應接受這樣的。 – 2016-05-17 07:40:43
OP只會用他/她的賬戶發佈一次,這個問題要更具體一些。這給了他/她幾乎2K的聲望(!),答案沒有被標記爲接受,因爲該賬戶自那一天起被放棄。 – MurariAlex 2017-09-15 19:48:18