2015-10-07 82 views
0

我遇到了实体框架的问题,当我执行SaveChanges时,上下文有很多与它关联的对象,一些对象被更新,一些被添加,然后我想要使用所有这些项目的Id(添加项目的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); 
} 

在此先感谢您的帮助。

+0

'updatedEvents'不是'list',但再次执行任何时候你列举它的LINQ查询。如果你想缓存它以备后用,把'.ToList()'放在'updateEvents'赋值行的末尾。 –

回答

1

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

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

真棒,谢谢!为什么哦为什么我没有看到 –

0

首先您的“使用”声明很奇怪。 应该

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()。

在调用save-changes之后,我完全期待“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的正常方式。

您可以通过谈论的其他示例是他们使用外键和导航属性自动关联相关实体的位置,但您的代码看起来与此无关。

UPDATE


常规

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. 
} 
+0

我遇到的问题是更新和创建新对象(本例中为GenerationEvent对象)的例程很长且很复杂,我无法在最后传递列表,更新并在那里添加它们。您查询的代码行查询已经修改或添加了对象的上下文本身,并返回所有对象的列表(由Venerik建议的.ToList()后面的OK)在GenerationEvent类型中的状态的修改或添加。 –

+0

好的......对你在做什么感兴趣,你能解释一下吗......我知道你已经解决了它。试图理解为什么?我的意思是你为什么要这样做......我看到你对一个名为GenerationEvent的实体感兴趣,这些实体明显更新并添加子例程...并且你希望它们出来。我只是将它们添加到例程中的“内部列表”中,然后在调用savechanges时用更新的id来更新它们。那怎么办?它不那么复杂。 – Seabizkit

+0

是的,它有点奇怪。他们完全改变了系统的架构,同时增加了一大堆额外的功能。以前系统从Web服务中获取并输入,并将事件详细信息添加或更新到本地数据库,然后实体对象的部分类有一个方法来生成一个复杂的XML文档,然后从其他地方ftp关闭该文档。我被要求将这个文档发送到不同的位置,并且架构师已经指定将这个处理与服务之间的服务总线隔开。本来会做得不同! –