簡體   English   中英

從實體框架的列表中返回ID

[英]Returning Id's from a list in Entity Framework

我在使用Entity Framework時遇到問題,當我執行SaveChanges時,上下文中有很多與之關聯的對象,其中一些對象已更新並添加了一些,之后我想使用所有這些項目的ID(添加項目的ID僅在插入數據庫中時分配)。 保存更改后,所有對象的列表為空。

我已經在保存后更新對象的網站上看到了示例,所以我懷疑這可能是我首先獲取對象列表的方式

這是我的代碼:

// Lots of processing to create or update objects 
using (var localContext = this.context)
{
    var updatedObjects = localContext.ChangeTracker.Entries().Where(e => e.Entity is GenerationEvent && (e.State == EntityState.Modified || e.State == EntityState.Added));
    var updatedEvents = updatedObjects.Select(e => (GenerationEvent)e.Entity);

    // The list has 5 items in at this point
    localContext.SaveChanges();

    // This list is now empty
    DoSomethingWithList(updatedEvents);
}

在此先感謝您的幫助。

變量updatedEvents是一個Linq查詢。 Linq查詢不會立即執行。 到在您的代碼中執行它時,它將不再找到任何更新的對象。 .ToList()放在Linq查詢之后將立即執行它。

var updatedEvents = updatedObjects.Select(e => (GenerationEvent)e.Entity).ToList();

首先,您的“使用中”陳述很奇怪。 它應該是

using (var context = new MyContext()) //passing in optional connection string.
{

}

那么您訪問實體的方式似乎很奇怪,或者我不知道您在那做什么?

var updatedObjects = localContext.ChangeTracker.Entries().Where(e => e.Entity is GenerationEvent && (e.State == EntityState.Modified || e.State == EntityState.Added));
var updatedEvents = updatedObjects.Select(e => (GenerationEvent)e.Entity);

似乎您在詢問上下文中所有被視為“添加”或“更新”的項目

然后,您接受對上下文的更改。 例如SaveChanges()。

我完全希望在調用保存更改后“ updatedEvents”為空。

改變你的東西...像

using (var context = new MyContext()) //passing in optional connection string.
{
    LIst<EntityType> listOfChangedEntities = //ToDo:either passed in or generated
    context.EntityType.AddRandge(listOfChangedEntities);
    context.SaveChanges();

    //after SaveChanges has been done all the entities in the 
    //listOfChangedEntities will now have there id's

    //for update, fetch the entities... change them and Update them

}

我懷疑您正在嘗試創建某種通用代碼來處理任何類型的Entity而不指定其類型。 您的代碼本身並不適合此操作,如果這是您要執行的操作,我將修改問題以詢問您要實現的目標。 但是以上是獲取已插入實體ID的常規方法。

您一直在談論的其他示例是它們使用外鍵和導航屬性自動關聯相關實體的地方,但是您的代碼看起來與此相去甚遠。

更新


常規

public static DoWork()
{
   var context = new MyContext();  

   List<GenerationEvent > internalEntityType = new List<GenerationEvent ();
   foreach(var item in SomeList)
   {
        var newItemEntity = new GenerationEvent();
        newItemEntity.Name = "Test";
        context.GenerationEvent.Add(newItemEntity);

        //add to internal list
        internalEntityType.Add(newItemEntity )
   }
   context.SaveChanges();

   var first_id = internalEntityType.FirstOrDefault().Id;
   //first_id will not be 0 it will be the Id the database gave it.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM