【问题标题】:Entity Framework - explain my code实体框架 - 解释我的代码
【发布时间】:2015-03-08 18:21:28
【问题描述】:

这是对这段代码的正确理解吗?它是更新具有urlURLPath 的行以使IsInProcessing 列为true 的正确方法吗?

我还没有真正尝试过这段代码。在我这样做之前,我想尝试并理解它!它是从各种来源拼凑而成的。

代码:

using(var db = new DamoclesEntities())
{
    var urls = db.URLS;
    var result = urls.FirstOrDefault(u => u.URLPath == url);
    result.IsInProcessingQueue = true;
    db.SaveChanges();
}
  1. 我认为这里发生的事情是使用我将DamoclesEntities() 类实例化为var db
  2. 然后我将db.URLS(类/表)实例化为var urls
  3. 然后我找到URLPath(列)包含url 的第一行,并将该行分配给result
  4. 我将该行的IsInProcessingQueue(列值)更改为true
  5. 最后,我将更改保存到数据库中。

【问题讨论】:

  • 代码应该可以工作并且你理解正确,但是它可以做得更优雅并使用标准命名约定。
  • 您的理解基本正确。 using 确保数据库正确关闭,分配 db.URLS 到新变量不会实例化它。除此之外,你知道会发生什么。不过我还是会推荐你读一本书什么的。
  • 如果找不到 URL,它也可能会失败:在这种情况下,您将得到 result = null 和空指针异常。这有可能发生吗?您可以将 FirstOrDefault 更改为 First 但如果它不存在则只会引发不同的异常。在这种情况下你想要什么行为?

标签: c# entity-framework-6 updatemodel


【解决方案1】:

这几乎是正确的,但请记住,如果指定条件没有找到任何行,FirstOrDefault 将返回空值 - URLPath == url

所以在这种情况下,下一行将产生 NullReferenceException。

只需检查 result 是否为 null 并仅在 result != null 时执行 result.IsInProcessingQueue = true;db.SaveChanges();

【讨论】:

  • “这几乎是正确的” - 你能详细说明一下吗?什么不正确?只是 NPE?
  • 什么是不正确的——“使用”不仅仅是“实例化”,它是一种构造的捷径,它调用了“db”实例的 Dispose() 方法。当然不是空检查。
  • 您可以阅读有关using here 的信息。仔细阅读备注。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多