【问题标题】:Entity Framework, retrieve saved value that is not always computed实体框架,检索不总是计算的保存值
【发布时间】:2013-11-19 10:46:35
【问题描述】:

我遇到了一个实体框架难题。

我有一个需要在保存时传递的 GUID 属性,该属性映射到一个字段,如果它是一个空的 GUID,它将被触发器更改。

如果我使用 DatabaseGeneratedOption.Computed,EF 不会将值传入(但会检索它)。如果我不使用它,则不会检索到该值,我需要重新获取实体以获取该属性。

理想情况下,我想我想要一个还允许设置值的 Computed 版本,或者 DatabaseGeneratedOption.AlwaysRetrieve 或类似的版本。是否有任何其他方法可以标记属性以在插入后始终从数据库中检索其值?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    这与其说是 EF 问题,不如说是 DB 提供程序问题。

    对于大多数数据库,您要么让它自动生成 GUID 标识符,要么不让它自动生成,两者之间没有任何区别。另一种方法是编写一个自定义触发器来检测您是否从客户端传递了一个 ID,如果没有,则生成一个服务器端。

    最终,这意味着将您在 EF 中的 ID 字段设置为 DatabaseGeneratedOption.None,以便您可以从客户端传递值。

    【讨论】:

    • 在这种情况下,它是一个生成 GUID 的触发器。在某种程度上,问题在于 EF,因为我希望能够标记一个字段以在提交后检索其值,但不阻止我更新该值。这在理论上可以是任何类型的字段,在这种情况下它恰好是一个 GUID。我认为 EF 假设它是数据更新的唯一来源。
    • @tensor 我明白了,我想我不能接受这样一个事实,即如果 ID 是 生成的服务器端,您需要以某种方式重新获取它。您是否有任何理由不向客户发送 ID?
    • 是的,这不是主键本身 - 它是其他一些任意值。基本上,如果我传递一个值,我想要那个值 - 如果我传递一个空值,就会发生一些魔法(好吧,一个触发器,所以是邪恶的魔法)并且它被填充,但无论哪种方式,我都需要返回该值,并希望避免如果可能的话,再来一次。如果我完全控制插入,这将是微不足道的,因为我只想要一个“计算的”属性 - 但似乎我不走运。
    • @tensor 是的,EF 不支持这种事情,避免往返的唯一方法是始终在客户端生成价值。你有什么理由不能把它全部放在客户端?
    • 不幸的是,在这种情况下,我只能使用顺序 guid。我有另一种可能的解决方法,它有点脏,但比插入然后选择的性能问题要少。感谢您抽出宝贵时间提供帮助。
    【解决方案2】:

    当一个人陷入此类问题时,通常表明一个人正在尝试做某事反对正在使用的框架/库(在这种情况下为实体框架)的架构意图.

    执行此操作的“Entity Frameworkish”方法是根本不使用触发器,而是在实体本身中实现所需的功能。

    如果这不是一个选项,您可以在调用 SaveChanges() 之后立即使用 ObjectContext 上的 Refresh() 方法用数据库中的值刷新实体。

    如果您使用 Code First 和 DbContext,您可以通过强制转换访问 Refresh() 方法:

    var objCtx = ((IObjectContextAdapter)db).ObjectContext;
    objCtx.Refresh(RefreshMode.StoreWins, myEntity);
    

    【讨论】:

      【解决方案3】:

      如果这个问题是如何确保字段在保存时永远不是空的Guid,那么我不会使用触发器来执行此操作。在您的代码中执行此操作不是更容易吗?

      if (entity.GuidValue == Guid.Empty)
          entity.GuidValue = Guid.NewGuid();
      
      context.SaveChanges();
      

      如果您已使用触发器,那么我认为您将需要刷新实体。这真的很重要吗?

      似乎确实有一种方法可以使用Guid as an IDENTITY column with another IDENTITY column in the same table,尽管我不确定它是否完全符合您的要求?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多