从实体框架中的列表返回Id's

本文关键字:Id 返回 列表 实体 框架 | 更新日期: 2023-09-27 18:16:44

我与实体框架有一个问题,当我执行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);
}

提前感谢您的帮助。

从实体框架中的列表返回Id's

变量updatedEvents是Linq查询。Linq查询不会立即执行。当它在代码中执行时,它将不再找到任何更新的对象。将.ToList()放在Linq查询之后将立即执行它。

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

首先你的"using"语句是奇怪的。应该是

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"是空的,在save-changes被调用后。

改变你的东西…到像

这样的东西
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
}

我怀疑你正在尝试创建某种泛型代码来处理任何类型的实体,而不指定其类型。你的代码不适合这个,因为它是,如果这是你想要做的,我会修改这个问题,问你想要实现什么。但以上是获取已插入实体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.
}