【问题标题】:LINQ to SQL - database relationships won't update after submitLINQ to SQL - 提交后数据库关系不会更新
【发布时间】:2012-07-07 21:12:34
【问题描述】:

我有一个包含 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 不会更新对象的引用,因此我应该简单地从新的SQL 请求中“重置”user 对象。我的意思是:

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.SubmitChanges(); 之后添加了db.Dispose; db = new DBDataContext();,只是为了看看它是否有任何作用。没有。

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

【问题讨论】:

  • 尝试在 foreach 循环之后而不是内部添加db.SubmitChanges()
  • 如果你还是要从数据库中检索用户,为什么还要使用 Session 对象呢?另外,db.Users.SingleOrDefault(u => u.UserID = user.UserID)
  • 很抱歉 - db.SubmitChanges() 不在 foreach 循环中。循环不在那个方法中。调用SubmitChanges 的方法是Upload,另一个方法有那个foreach 循环。罗伯特:怎么会?我需要检查一下。谢谢!
  • 罗贝特,你可能不明白我的意思。我不是每次都从数据库中检索用户。我刚刚执行了一次 - Session["user"] = db.Where(...) - 它没有帮助 - 所以我删除了它。
  • 您是否对所有代码使用相同的上下文?您应该只使用一个或关闭第一个然后打开第二个。

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


【解决方案1】:

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

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

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

【讨论】:

  • 所以你的意思是 user 对象不是通过重建来更新的。 AKA 按价值,而不是按参考。就像我怀疑的那样。我相信更新对象不是最好的方式,而是最有效的?我应该坚持还是尝试其他方法?
  • @QuanticProgramming 它与值/引用无关,并且与您的会话存储实体没有数据库上下文这一事实有关(即它对数据库一无所知,所以当数据库改变时不能更新)。至于如何处理这个问题,这真的取决于你和你的整体代码库和设计。就个人而言,我避免像瘟疫一样使用会话,但如果你确实想要/需要使用它来存储实体,你将不得不自己管理更新这些存储的实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多