gpt4 book ai didi

entity-framework-4.1 - 无法将 StoreGeneratePattern.Identity 与数据库触发器生成的主键值一起使用?

转载 作者:行者123 更新时间:2023-12-02 03:22:39 24 4
gpt4 key购买 nike

这个问题与我在这里提出的另一个问题( Entity Framework 4.2 - How to realize TPT-Inheritance with Database-generated Primarykey Value? )相关,并且应该简单地澄清我对主题中所述问题的假设是否正确。

问题(详细):

  • 我想使用 EF (4.1) 访问已存在的数据库
  • 数据库在为其表生成主键值方面有一些限制(有一个 UDF 接受表名并返回下一个可用 ID)
  • 为了让事情对我自己来说尽可能简单,我的第一个方法是定义数据库触发器(在插入之前),调用 ID 生成 UDF 以在插入新数据行时设置新 ID
  • 然后我将 EDM 的 csdl 中相应实体的 StoreGeneratePattern 属性设置为“Identity”,以便将新生成的 ID 保存到数据库后在实体对象中设置

结果是:

当我创建一个新的实体对象,将其添加到 DbContext 并对其调用 SaveChanges 时,相应的数据行已插入到数据库中,但该实体并未使用新的数据库生成的 ID 进行更新。当我尝试一次保存更多彼此(父子)关联的内容时,我意识到了这一点,因为子实体的外键属性无法正确设置,因为父实体的新 ID 不为父实体所知。数据库上下文。

这就是我提出上述有关 TPT 继承问题的原因。

经过几天的研究并尝试了我想到的所有方法来解决这个问题,我想我意识到,这根本行不通。尽管 MSDN 上的 StoreGeneratePattern 枚举的文档和博客中的一些解释表明,应该设置 StoreGeneeratedPattern.Identity 来检索生成的值,但当数据库在插入新行时生成值时,对于结合主键来说情况并非如此使用数据库触发器。

经过长时间思考,这对我来说似乎完全符合逻辑,因为 EF 需要一些标准来检索数据库生成的值,而且我认为在大多数情况下这将是实体的身份。对于设置为自动增量(或标识列,...)的数据库列可能没有问题,因为 DBMS 提供了一些功能来检索最后插入的标识值(例如 MSSQL 中的@@identity)。但是,当使用触发器生成新的标识值时,EF 显然不知道如何查询新插入的行(而且我也无法想象任何好的独立于数据库的方法来执行此操作)。

所以我真正的问题是:上述假设是否正确,还是我忽略了这里重要的东西?

提前感谢您对此的任何澄清/启发。

编辑(后续问题):

阅读 Ladislav 的答案后,出现了另一个问题:

如果我在 CSDL 中设置 StoreGeneratePattern,是否必须在 SSDL 中将其设置为相同的值(反之亦然)? edm 设计器的补丁暗示了这种情况,因为当您在 CSDL 中更改 StoreGeneratePattern(通过设计器)时,它会自动同步 SSDL 中的 StoreGeneratePattern。

最佳答案

StoreGeneratePattern.Identity 应该可以工作。如果您在 EF 设计器中进行设置,请确保在 EDMX 文件的 SSDL 和 CSDL 部分中正确配置它(以 XML 形式打开以进行检查)。 EF 设计器中存在一个错误,导致仅在 CSDL 中正确设置,因此 SQL 部分不知道插入后必须从数据库中选择新 ID。在极少数情况下,此错误已由 installing VS 2010 SP1 解决。这绝对应该通过 special patch 来解决。

关于entity-framework-4.1 - 无法将 StoreGeneratePattern.Identity 与数据库触发器生成的主键值一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8645510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com