从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列

Posted

技术标签:

【中文标题】从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列【英文标题】:Removing Identity Column from SaveChanges in Database First Entity Framework 6.2 【发布时间】:2020-08-23 06:41:39 【问题描述】:

我有一个 SQL Server 表 Organization,它有一个唯一标识符作为 PK。客户要求将标识列添加为“友好 id”。

Organization organization = _db.Organizations.Find(organizationSource.UId);
_db.Entry(organization).CurrentValues.SetValues(organizationSource);
_db.SaveChanges();

现在返回“不支持使用 'Identity' 模式修改列。”

有没有办法标记标识列,以便数据库首先 EF 不会更新它,除非将其更改为会影响许多其他部分的 PK?

【问题讨论】:

属性是否映射为Computed? EF 正在从数据库表中生成类。将 StoreGeneratedPattern 设置为 Identity。 然后设置为计算值。 【参考方案1】:

可能有一个你可以使用的属性。但我不知道。作为一种解决方法,您能否单独设置组织对象属性?

Organization organization = _db.Organizations.Find(organizationSource.UId);
_db.Entry(organization).Property(a => a.MyProperty1).CurrentValue = organizationSource.MyProperty1;
_db.Entry(organization).Property(a => a.MyProperty2).CurrentValue = organizationSource.MyProperty2;
// and so on for all properties except the primary key and the identity property
_db.SaveChanges();

或者,另一种选择可能是从 organizationSource 类定义中删除您的身份属性(假设您可以控制 organizationSource 类)。

【讨论】:

我可以手动设置属性,但我不期待这样做,因为有许多属性和许多表都要求进行这种更改。我想我可以使用 AutoMapper 将 organizationSource 映射到一个没有标识属性的新类,但这意味着要维护两个类。 @NeilN 然后可能使用反射来循环遍历属性,不包括身份之一?虽然,使用反射将是最后的手段。或者......让您的组织继承您的 OrganizationSource 类,而您的组织类具有额外的身份属性。更容易维护......但仍然是两个类。希望有人找到一种使用属性的方法。可能值得将您的组织类定义添加到您的问题中。

以上是关于从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列的主要内容,如果未能解决你的问题,请参考以下文章

撤消实体框架实体中的更改

如何从实体框架中的存储过程中获取结果+数据库优先

将实体框架从数据库优先转换为代码优先

如何使用实体框架代码优先从数据库中删除所有相关实体

代码第一个约定不在实体框架6.2中的多对多关系上创建连接表

无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体