我有一个包含表格Users
和Uploads
的数据库。重要的栏目是:
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
确实有新的上传!
有没有人遇到过这类问题,还是正常的行为?我是这个框架的新手。我很乐意接受任何建议。
谢谢!
P.S我在另一种方法中有DB.Uploads.Count()
行,并且在添加上传后 增加。
编辑:我尝试过的一些事情:
db = new new DBDataContext();
我在db.Dispose; db = new DBDataContext();
之后在我的第一个方法中添加db.SubmitChanges();
,只是为了查看它是否有效。它没有。user.Uploads.Add(upload);
。它 将适当的对象添加到user.Uploads
,然后在foreach
循环中使用它。好吧,呃。但我仍在等待对此行为的一些解释。谢谢!答案 0 :(得分:1)
在会话中存储User对象会导致它在后续请求中与数据上下文断开连接。因此,对数据库(对于用户实体或其任何子实体)所做的任何更改都不会反映在对象实例中。
要解决这个问题,您有几种选择。正如您所做的那样,只要您进行更改,就可以自己更新Session-stored对象实例。您还可以在进行任何数据库更改之前重新连接存储在会话中的实体(这本身可能存在问题)。您还可以在更改数据时刷新会话对象实例。最后,您根本无法将对象存储在会话中,只需在需要时从数据库中检索它。
您提到您尝试刷新存储的会话对象但没有帮助。我假设您在致电SubmitChanges()
后这样做了,对吗?这应该有效。你能发布两个有问题的方法(即插入新上传的完整方法和包含foreach
循环的方法)以及它们如何互动吗?