我有一个实体框架难题我遇到了问题。
我有一个GUID属性,我需要传递一个保存,它映射到一个字段,如果它是一个空的GUID,它将被触发器改变。
如果我使用DatabaseGeneratedOption.Computed,则EF不传递值(但会检索它)。如果我不使用它,则不会检索该值,我需要重新获取实体才能到达该属性。
理想情况下,我想我想要一个允许设置值的Computed版本,或者一个DatabaseGeneratedOption.AlwaysRetrieve,或者其他类似的版本。是否有任何其他方法可以标记属性,以便在插入后始终从数据库中检索其值?
答案 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,虽然我不确定它是你想要的吗?