我创建了一个存储过程,它返回一个表(物理存储表)。
CREATE PROCEDURE uspTest
AS
BEGIN
SELECT * from Table1
END
当我使用Entity Framework捕获输出时,它会正确加载实体。
var output = entities.Database.SqlQuery<Table1>("dbo.uspTest").ToList<Table1>();
“output”变量包含从SP返回的数据,但是这个Table1对象的List不会自动加载外键表。我在下面添加了代码以缓解此问题
foreach (var member in output)
{
entities.Table1s.Attach(member);
}
附加每个实体后,为每个Table1成员链接所有子表。但是,当我第二次回到同样的方法时,它会给我一个无法附加的错误。
Attaching an entity of type 'Table1' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values.
我尝试将实体状态设置为分离但没有运气!有没有人知道我应该在这做什么?
我正在使用数据库第一种方法。
答案 0 :(得分:1)
即使返回的对象类型是实体类型,上下文也不会跟踪Database.SqlQuery<TElement>
的结果。如果您希望上下文跟踪返回的实体,则应使用DbSet<TEntity>.SqlQuery
方法:
var output = entities.Table1s.SqlQuery("dbo.uspTest").ToList();
这样您就不需要使用额外的代码来附加实体。
但是,当您拥有Table1
时,为什么要使用SP访问DBSet<Table1> Table1s
?我猜你有一个更复杂的存储过程,你这样做是为了解释你的问题,但如果这是你的SP,正如上面评论的@DLeh那样,你应该使用Linq to Entities。