LINQ to SQL - 提交后数据库关系不会更新

时间:2012-07-07 21:12:34

标签: c# asp.net sql-server linq-to-sql

我有一个包含表格UsersUploads的数据库。重要的栏目是:
Users -> UserID
Uploads -> UploadID, UserID
关系中的主键是Users -> UserID,外键是Uploads -> UserIDLINQ 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确实有新的上传! 有没有人遇到过这类问题,还是正常的行为?我是这个框架的新手。我很乐意接受任何建议。

谢谢!

P.S我在另一种方法中有DB.Uploads.Count()行,并且在添加上传后 增加。

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

  1. 我的代码中的第一个方法(初始化)是db = new new DBDataContext(); 我在db.Dispose; db = new DBDataContext();之后在我的第一个方法中添加db.SubmitChanges();,只是为了查看它是否有效。它没有。

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

1 个答案:

答案 0 :(得分:1)

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

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

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