首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用实体框架插入时设置Id字段

使用实体框架插入时设置Id字段
EN

Stack Overflow用户
提问于 2020-06-16 19:45:08
回答 1查看 758关注 0票数 2

当Id为某个设置值时,我在尝试插入实体时出错(整个图是正确的),例如6。它之所以有它,是因为它存储在另一个数据库中,我可以为列表中的每个元素和子列表中的每个元素等手动设置它。但我必须为每个元素和每个查询执行此操作。我希望有唯一的全局方法将Id字段设置为零,因为当我尝试插入值时,我得到错误:

代码语言:javascript
运行
复制
Cannot insert explicit value for identity column in table 'XXX' when IDENTITY_INSERT is set to OFF.

我希望我的数据库设置Id,并使实体框架忽略Id设置为0以外的任何值

我尝试的是替换OnSaveChanges,这似乎为时已晚,因为当使用Add或AddRange方法时,对象开始被跟踪,并且我不能为列表中的多个对象设置Id。

EN

Stack Overflow用户

回答已采纳

发布于 2020-06-16 22:01:22

在EF Core3.x中,您可以处理ChangeTracker.Tracked事件,并为每个Added实体显式设置自动生成的PK,如下所示(它不需要在外部,您可以将db上下文自动附加到该事件):

代码语言:javascript
运行
复制
dbContext.ChangeTracker.Tracked += (sender, e) =>
{
    if (!e.FromQuery && e.Entry.State == EntityState.Added && e.Entry.IsKeySet)
    {
        var pk = e.Entry.Metadata.FindPrimaryKey();
        if (pk.Properties.Count == 1)
        {
            var pkProperty = pk.Properties[0];
            if (pkProperty.ValueGenerated == ValueGenerated.OnAdd &&
                defaultValues.TryGetValue(pkProperty.ClrType, out var defaultValue))
            {
                e.Entry.State = EntityState.Detached;
                e.Entry.CurrentValues[pkProperty] = defaultValue;
                var newEntry = e.Entry.Context.Entry(e.Entry.Entity);
                newEntry.State = EntityState.Added;
            }
        }
    }
};

其中,defaultValues是一个字典,其中包含支持的自动增量属性类型的盒装0 (零)值(如果需要,您可以添加更多):

代码语言:javascript
运行
复制
static readonly Dictionary<Type, object> defaultValues = new Dictionary<Type, object>
{
    { typeof(int), default(int) },
    { typeof(long), default(long) },
    { typeof(decimal), default(decimal) },
};

但请注意,这不会修复使用显式FK属性而没有引用导航属性的关系。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62407673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档