我遇到了Entity Framework的问题,当我执行SaveChanges时,上下文中有很多与之关联的对象,一些对象被更新,一些被添加,之后我想使用Id&# 39;所有这些项目(添加项目的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);
}
提前感谢您的帮助。
答案 0 :(得分:1)
变量updatedEvents
是Linq查询。 Linq查询不会立即执行。当它在您的代码中执行时,它不再能够找到任何更新的对象。在Linq查询之后放置.ToList()
将立即执行它。
var updatedEvents = updatedObjects.Select(e => (GenerationEvent)e.Entity).ToList();
答案 1 :(得分:1)
首先你的“使用”声明是奇怪的。 它应该是
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
}
我怀疑您正在尝试创建某种通用代码来处理任何类型的实体而不指定其类型。您的代码不适合这样,如果您正在尝试这样做,我会修改问题以询问您要实现的目标。但上面是获取已插入实体的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.
}