lazy - mvc c# entity framework




我如何獲得實體框架中插入的實體的Id? (6)

保存更改後,您需要重新加載實體。 因為它已被EF無法跟踪的數據庫觸發器更改。 所以我們需要重新從DB重新加載實體,

db.Entry(MyNewObject).GetDatabaseValues();

然後

int id = myNewObject.Id;

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

如何在使用defaultValue時在Entity框架中獲取插入實體的Id?

在下面的問題看@christian答案也可以幫助:

實體框架刷新上下文?

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


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


我一直在使用Ladislav Mrnka的答案 ,在使用實體框架時成功檢索ID,但是我在這裡發布是因為我一直錯過使用它(即在不需要它的地方使用它),並且認為我會在此發布我的發現,人們正在尋求“解決”我所遇到的問題。

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

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和order.CustomerId之間有一個外鍵關係

我所要做的就是這一點;

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的開發人員過度使用頂級投票答案來解決某些可能不需要的問題。


我遇到了一種情況,我需要將數據插入到數據庫中,同時需要使用實體框架的主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;
 }

首先使用EF 6.x代碼

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

並初始化一個數據庫表,它會放一個

(newsequentialid())

在標題默認值或綁定下的表格屬性中,允許在插入ID時填充ID。

問題是如果你創建一個表並添加

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

部分後來,未來的更新數據庫將不會添加(newsequentialid())

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


這很容易。 如果您使用數據庫生成的ID(如MS SQL中的IDENTITY ),則只需將實體添加到ObjectSetSaveChanges相關的ObjectContextId會自動為您填寫Id

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

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

默認情況下,實體框架在使用自動生成的Id時使用SELECT SCOPE_IDENTITY()每個INSERT





entity