【问题标题】:How to conditionally generate DatabaseGenerated GUID in Entity Framework如何在实体框架中有条件地生成 DatabaseGenerated GUID
【发布时间】:2016-11-17 05:44:41
【问题描述】:

我使用 Entity Framework 6 作为与 SQL Server 数据库通信的 ORM。插入新记录时有两种情况:

  1. 记录的GUID为空,此时我添加属性

    DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    在我的 POCO 上我的 ID 字段上方,数据库很乐意为我的记录生成一个新的顺序 GUID。

    这种情况最适合索引。我的客户首先与 API 对话,该 API 尝试将记录插入数据库并让数据库生成顺序 GUID。


  1. 记录的 GUID 已设置,在这种情况下,应在数据库中设置 GUID。但是,EF 忽略了这一点,并要求数据库生成一个新的顺序 GUID。

    这种情况是客户端离线或无法访问 API 的情况。在这种情况下,它将使用自己生成的 GUID 在本地持久化数据,然后尝试将其保存到数据库中。

我已经进行了一些搜索,但似乎找不到任何方法来仅在尚未设置的情况下有条件地要求数据库生成新的 GUID。这可能吗?

谢谢!

【问题讨论】:

标签: c# mysql entity-framework


【解决方案1】:

是的。使用EF的AddOrUpdate方法

见AddOrUpdate

【讨论】:

  • 我刚刚试过这个。没有太多细节可以继续,但我对如何使用该方法进行了一些研究。但它似乎不起作用。
  • 您能解释一下 AddOrUpdate 将如何提供帮助吗?这是一个仅链接的答案,可能会被审核过程删除。
【解决方案2】:

你不能同时拥有两者。在这种情况下,您将 EF 配置为让数据库在每次插入记录时创建一个新 ID,并且 EF 将始终这样做。当一条记录作为插入跟踪时,它将始终遵循此行为。

您需要一种方法来跟踪哪些实体无法到达要插入的服务器,并且客户端应用程序在线时能够同步更改。

我将创建一个不同的本地数据关系,以允许跟踪本地存储中的实体。这需要更多的努力,但值得付出努力。

【讨论】:

  • 我在想一种方法是让所有本地存储的关系都通过本地 GUID 工作,比如“LocalTransactionId”,并有一个单独的(唯一但可以为 null 而不是主要的键)由服务器分配的 GUID,称为“ServerTransactionId”。如果记录可以成功插入到服务器的数据库中,则将两者设置为相同,否则,则它们将不同。无论如何,EF 使用本地 ID 来处理所有本地关系,客户端使用服务器 ID 与 API/Server 进行通信。想法?
  • 在上面的例子中,服务器只会知道 ServerTransactionId,而客户端会同时持有 LocalTransactionId 和 ServerTransactionId。
  • 这可能是实现它的一种方式。请记住,您不想使用在服务器端没有任何意义的属性来弄脏您的服务器实体。在反序列化中找到一种方法来删除它们。
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
相关资源
最近更新 更多