我有一个Database First EDMX,其中一个实体的属性必须设置为 StoreGeneratedPattern = Identity 才能使用顺序GUID作为主键。
这样可以正常工作,但是只要使用“从数据库更新模型”刷新模型,该值就会重置为 StoreGeneratedPattern =无,并且必须手动编辑。
这是一个潜在的人为错误的麻烦和重要来源,特别是如果必须更改多个表,并且多个开发人员可能会对数据库进行更改并根据需要更新EDMX。
我收集到了没有简单方法来保存StoreGeneratedPattern值,但是有一种不简单的方式吗?甚至可能是每当EDMX更新并编辑EDMX时运行的自动脚本?任何解决方案都不需要知道需要编辑的所有内容吗?
谢谢
答案 0 :(得分:2)
这是因为它无法隐式地将GUID列设置为SQL Server中的自动递增标识。我知道你可以放置一个hack,例如将这个“所谓的”标识列的默认值设置为newsequentialid(),以自动用GUID填充此列,但从技术上讲,此列本身不是此表的标识列。显然,当EF在“从DB更新模型”期间生成EDMX时,它会将此列视为常规列而不是自动递增标识,因此会将手动编辑的StoreGeneratedPattern = Identity重写为StoreGeneratedPattern = None。
这是一个黑客,我强烈建议不要对EF自动生成代码进行任何更改。我已经看到许多开发人员在他们这样做的时候会立即进行补救,但是当它回来后再咬他们时他们希望他们从不操纵自动生成的代码。
请注意!
答案 1 :(得分:0)
我的所有主键都是具有约束DEFAULT (newsequentialid())
的Guids。忽略@Manish的非常好的建议,我在NotePad ++中使用以下两个find-and-replace正则表达式,在从DB更新后更新.edmx
文件:
查找#1: (<Key>\s*<PropertyRef Name="([^"]+)" />\s*</Key>\s*<Property Name="\2" Type="uniqueidentifier" )(Nullable="false" />)
替换#1: \1StoreGeneratedPattern="Identity" \3
查找#2: (<Key>\s*<PropertyRef Name="([^"]+)" />\s*</Key>\s*<Property Name="\2" Type="Guid" Nullable="false" )(/>)
替换#2: \1annotation:StoreGeneratedPattern="Identity" \3
这仅适用于PK是表格中的第一个字段的地方。
YMMV。使用风险自负。