插入不存在的实体,否则使用已有的实体-如何插入

本文关键字:插入 实体 何插入 不存在 | 更新日期: 2023-09-27 18:12:41

下面是一个场景:有用户,用户有技能。如果用户指定新技能,则需要添加新技能,但如果用户指定现有技能,则应该链接到现有技能。所以,设置是非常基本的- 3个表(用户,技能,userSkillsLink)。这是一个web应用程序,但我不想把所有的技能都添加到下拉菜单中,所以我不知道技能是否存在。我可以检查技能是否已经存在使用选择,但在web应用程序,这不是最好的选择-不是线程安全。我可以跟踪哪些技能已经存在于一个单独的缓存中,但这个问题应该是…非常普遍,所以我想我可能过于复杂了,而且已经有一个已知的解决方案了。

谢谢!

插入不存在的实体,否则使用已有的实体-如何插入

我将创建一个存储过程,该过程将以技能的名称作为参数,执行检查并在需要时插入新记录,然后返回结果记录(现有的或新的)。

然后我可以将该过程映射到DbContext上的方法,并使该方法返回一个实体。

我可以把它命名为:var skill = database.GetSkillCreateIfNone( skillName )

我认为用事务语义解决这个问题的正确方法是:

  • 使潜在的共享值成为其表的主键,以保证它是唯一的
  • 查询填充下拉菜单并将结果存储在本地缓存
  • 如果缓存中存在记录,则重用它
  • 如果记录不存在,创建它

然后通过让事务抛出异常来处理并发性。在异常处理程序中,您可以重新查询并使用现有值。

如果您的事务再次死亡(如果记录被删除),只需给用户一个适当的错误消息,并告诉他们再试一次。

你不能真正做到这一点,因为你不能查询和提交除了只是包装在一个事务,甚至在一个存储过程。