我正在使用Entity Framework 4.0 POCO实体 我已在插入上映射自定义存储过程 程序[dbo]。[usp_MyTable_Insert] ( @ Value1 char(1), @ Value2 varchar(5), @ Value3 varchar(20) .... ) 如 开始交易 插入“dbo”。“MyTable” ( “值1”, “值2”, “值3” ) VALUES ( @值1, @值2, @值3 )
DECLARE @Id int - 获取最新的ID。 SET @Id =(SELECT CAST(@@ IDENTITY AS INT))
- 使用某些值更新表格 更新“dbo”。“MyTable” SET Value3 =(SELECT SomeTableColumn 来自SomeTable 什么东西=某事 ) WHERE [Id] = @Id
COMMIT TRANSACTION
SELECT @Id AS“Id”
END
将实体插入数据库,然后更新数据库中的某些列 然后返回身份。一切都很简单。
public int InsertRecord(RecEntity recEntity) { context.AddObject(“RecEntities”,recEntity);
context.SaveChanges();
return recEntity.Id;
}
方法插入效果很好。 然后我需要用插入存储过程的值更新当前实体。 我的存储库中有方法来检索数据
public RecEntity SingleRecEntity(Expression> where) { return context.RecEntities.Single(where); } 当我调用此方法时,存储过程插入的值不会出现在实体中。
id = repository.InsertRecord(recEntity); recEntity = repository.SingleBrokerPreRegistration(x => x.Id == id); //没有来自数据库的新值
我在查询分析器中运行实体框架生成的查询,它返回所有最新值。 但是出于某种原因,datacontext不想更新这个实体。
可能应该有一些方法来改变这种情况。 可能有人可能会解释这种行为。 需要帮助。
答案 0 :(得分:3)
使用StoreWins参数尝试Refresh方法。
除非未明确调用Refresh方法,否则EF不会刷新值,以防已经有指定了Entity Key的附加对象
答案 1 :(得分:0)
如果您在集合上运行.Load(Objects.MergeOption.OverwriteChanges)
,您将获得任何新添加的项目。如果您希望“刷新”已删除的项目,则需要在运行.Load
全部放在一起(抱歉vb)
For Each child in Parent.ChildCollection.ToArray()
context.Detatch(child)
Next
Parent.ChildCollection.Load(Objects.MergeOption.OverwriteChanges)
这对我有用,但如果有一种更优雅的方式,我很乐意看到它!