实体框架,检索并非总是计算的已保存值

时间:2013-11-19 10:46:36

标签: c# entity-framework

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

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

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

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

3 个答案:

答案 0 :(得分:0)

这不是EF问题,而是更多数据库提供商问题。

对于大多数数据库,您要么自动生成GUID标识符,要么不自动生成GUID标识符,中间没有。另一种方法是编写一个自定义触发器,用于检测是否已从客户端传递了ID,如果没有生成一个服务器端。

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

答案 1 :(得分:0)

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

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

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

如果您使用的是Code First和DbContext,则可以通过演员投放Refresh()方法:

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

答案 2 :(得分:0)

如果这个问题是如何确保一个字段在保存时永远不会是空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,虽然我不确定它是你想要的吗?