2016-11-16 90 views
0

我正在使用实体框架6作为我的ORM与SQL Server数据库交谈。我有两个场景中插入新记录时:如何在实体框架中有条件地生成DatabaseGenerated GUID

  1. 记录的GUID是空的,在这种情况下,我在我的波苏斯添加属性

    DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    我上面的ID字段,以及数据库愉快地为我的记录生成一个新的顺序GUID。

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


  • 记录的GUID已经被设置,其中,该GUID应在数据库中设置的情况。但是,EF忽略这一点,并要求数据库生成新的顺序GUID。

    这种情况下,客户端处于脱机状态或其他方式无法访问API。在这种情况下,它会使用自己生成的GUID在本地保存数据,然后尝试将其保存到数据库中。

  • 我已经做了一些搜索和似乎无法找到任何办法只能有条件地问数据库,生成一个新的GUID如果尚未设置。这可能吗?

    谢谢!

    +0

    重复:http://stackoverflow.com/q/40598817/861716 –

    +0

    如果你不会找到更好的方法,一个选项是自己生成顺序guid(例如:http://stackoverflow.com/q/211498/5311735) – Evk

    回答

    0

    是的。使用方法EF

    的AddOrUpdate见AddOrUpdate

    +0

    我刚才试过这个。没有太多细节可以继续,但我对如何使用该方法进行了一些研究。它似乎并没有工作。 – derf26

    +0

    你能解释AddOrUpdate如何帮助吗?这是一个仅有链接的答案,可能会被审核流程删除。 –

    0

    在同一时间不能兼得。在这种情况下,您正在配置EF,以便每次插入记录时让数据库创建一个新的ID,EF将始终这样做。当记录作为插入被追踪时,它总是会遵循这种行为。

    您需要一种方法来跟踪哪些实体无法到达要插入的服务器,以及客户端应用程序联机时是否能够同步这些更改。

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

    +0

    我在想这样做的一种方式是让所有本地存储的关系通过本地GUID工作,称为“LocalTransactionId”,并且有一个单独的(唯一的,但可以是空的而不是主键)由该服务器称为“ServerTransactionId”。如果记录可以成功插入到服务器的数据库中,那么两者将被设置为相同,如果不是,那么它们将会不同。无论如何,EF使用本地ID来处理所有本地关系,并且客户端使用服务器ID来与API /服务器进行通信。思考? – derf26

    +0

    在上面的示例中,服务器只会知道ServerTransactionId,而客户端将同时拥有LocalTransactionId和ServerTransactionId。 – derf26

    +0

    这可能是实现它的一种方式。请记住,您不想使用在服务器端没有意义的属性来玷污服务器实体。在你的反序列化中寻找一种方法来删除它们。 –