从数据库优先实体框架 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 中删除标识列的主要内容,如果未能解决你的问题,请参考以下文章