如何在刷新DB First EDMX时保留StoreGeneratedPattern设置

本文关键字:保留 StoreGeneratedPattern 设置 EDMX First 刷新 DB | 更新日期: 2023-09-27 18:22:33

我有一个数据库优先EDMX,其中一个实体的属性必须设置为StoreGeneratedPattern=Identity才能使用顺序GUID作为主键。

这是正确的,但是每当使用"从数据库更新模型"刷新模型时,该值都会重置为StoreGeneratedPattern=None,并且必须手动编辑。

这是一个麻烦,也是潜在人为错误的重要来源,尤其是如果必须更改多个表,并且多个开发人员可能会对数据库进行更改并根据需要更新EDMX。

我认为没有简单的方法来保存StoreGeneratedPattern值,但有不简单的方法吗?甚至可能是在EDMX更新和编辑EDMX时运行的自动脚本?有什么解决方案不需要知道所有需要编辑的东西吗?

感谢

如何在刷新DB First EDMX时保留StoreGeneratedPattern设置

这是因为在SQL Server中不可能隐式地将GUID列设置为自动递增标识。我知道你可以采取一种方法,例如将这个"所谓"的标识列的默认值设置为newsequentialid(),以自动用GUID填充该列,但从技术上讲,该列本身并不是该表的标识列。显然,当EF在"从DB更新模型"期间生成EDMX时,它将此列视为常规列,而不是自动递增的标识,因此,将手动编辑的StoreGeneratedPattern=identity覆盖回StoreGeneratedPattern=None。

这是一个黑客攻击,我强烈建议不要对EF自动生成的代码进行任何更改。我见过许多开发人员在这样做以寻求即时补救时被烧伤,但当它回来后咬了他们一口时,他们希望自己永远不要操纵自动生成的代码。

只是一句警告!!!

我的所有主键都是具有约束DEFAULT (newsequentialid())的Guid。忽略@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。使用风险自负。