0

我有一个包含表格UsersUploads. 重要的列是:
Users -> UserID
Uploads -> UploadID, UserID
关系中的主键是Users -> UserID,外键是Uploads -> UserID
LINQ to SQL中,我做了以下操作:

Retrieve files
var upload = new Upload();
upload.UserID = user.UserID;
upload.UploadID = XXX;
db.Uploads.InsertOnSubmit(upload)
db.SubmitChanges();

如果我这样做并重新运行应用程序(db当然,对象是重新构建的) - 如果执行以下操作:

foreach(var upload in user.Uploads)

我使用该用户的 ID 获取所有上传。(就像在前面的例子中添加的那样)
问题是,我的应用程序在添加上传和提交更改后,不会更新user.Uploads集合。即 - 我没有收到新添加的上传。

user对象存储在对象中Session。起初,我虽然LINQ to SQL Framework不会更新对象的引用,因此我应该简单地user从新SQL请求中“重置”对象。我的意思是:

Session["user"] = db.Users.Where(u => u.UserID == user.UserID).SingleOrDefault();

(以前的用户在哪里user
但这没有帮助。
请注意:重新运行应用程序后,user.Uploads确实有新的上传!
有没有人遇到过这种类型的问题,或者这是正常行为?我是这个框架的新手。我很乐意接受任何建议。

谢谢!

PS我在另一种方法中有DB.Uploads.Count()一行,添加上传后确实增加了。

编辑:我尝试过的一些事情:

  1. 我的代码中的第一个方法(初始化)是db = new new DBDataContext();.
    我在我的第一种方法中添加了db.Dispose; db = new DBDataContext();after db.SubmitChanges();,只是为了看看它是否有任何作用。它没有。

  2. 作为一个快速修复,我做到了user.Uploads.Add(upload);。它确实添加了适当的对象user.Uploads,然后在foreach循环中使用该对象。嗯,呃。但我仍在等待有关此行为的一些解释。谢谢!
4

1 回答 1

1

将 User 对象存储在 Session 中会导致它在后续请求中与数据上下文断开连接。因此,对数据库所做的任何更改(对于用户实体或其任何子实体)都不会反映在对象实例中。

为了解决这个问题,您有多种选择。正如您所做的那样,您可以在任何时候进行更改时自己简单地更新会话存储的对象实例。您还可以在进行任何数据库更改之前重新连接存储在 Session 中的实体(这本身可能有问题)。您还可以在任何时候更改数据时刷新会话对象实例。最后,您根本无法将对象存储在会话中,只需在需要时随时从数据库中检索它。

您提到您尝试刷新存储的会话对象并没有帮助。我假设你是在打电话后这样做SubmitChanges()的,对吗?这应该有效。您能否发布有问题的两种方法(即插入新上传的完整方法和包含foreach循环的方法)以及它们如何交互?

于 2012-07-08T15:57:03.410 回答