实体框架核心:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“关系”中插入标识列的显式值

2024-02-09

我正在构建一个应用程序,当我想将表单插入表单表时,出现以下错误:

无法在表“关系”中插入标识列的显式值 当 IDENTITY_INSERT 设置为 OFF 时。

这些是我的模型:

表格型号:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("FormType")]
    public int? TypeId { get; set; }
    public virtual FormType Type { get; set; }

    [ForeignKey("FormStatusType")]
    public int? StatusTypeId { get; set; }
    public virtual FormStatusType StatusTknype { get; set; }

    [ForeignKey("Relation")]
    public int? SupplierId { get; set; }
    public virtual Relation Supplier { get; set; }

    [ForeignKey("Relation")]
    public int? CustomerId { get; set; }
    public virtual Relation Customer { get; set; }

    public String SupplierReference { get; set; }
    public Guid ApiId { get; set; }
    public DateTime DueDate { get; set; }
    public FormFile FormFiles { get; set; }
    public String FormName { get; set; }
    public DateTime UploadDate { get; set; }

关系模型:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("FormType")]
    public int? TypeId { get; set; }
    public virtual FormType Type { get; set; }

    [ForeignKey("FormStatusType")]
    public int? StatusTypeId { get; set; }
    public virtual FormStatusType StatusTknype { get; set; }

    [ForeignKey("Relation")]
    public int? SupplierId { get; set; }
    public virtual Relation Supplier { get; set; }

    [ForeignKey("Relation")]
    public int? CustomerId { get; set; }
    public virtual Relation Customer { get; set; }

    public String SupplierReference { get; set; }
    public Guid ApiId { get; set; }
    public DateTime DueDate { get; set; }
    public FormFile FormFiles { get; set; }
    public String FormName { get; set; }
    public DateTime UploadDate { get; set; }

我的上下文如下所示:

public class DataContext: DbContext
{
    public DataContext(DbContextOptions<DataContext> options): base(options)
    {

    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        optionsBuilder.UseSqlServer();
    }

    public DbSet<Relation> Relation { get; set; }
    public DbSet<Setting> Settings { get; set; }
    public DbSet<Notification> Notification { get; set; }
    public DbSet<FormStatusType> FormStatusType { get; set; }
    public DbSet<File> File { get; set; }
    public DbSet<FormFile> FormFile { get; set; }
    public DbSet<FormType> FormType { get; set; }
    public DbSet<Form> Form { get; set; }
    public DbSet<User> User { get; set; }
    public DbSet<RelationUser> RelationUser { get; set; }
    public DbSet<SupplierCustomer> SupplierCustomer { get; set; }

}

我用来添加表单的方法如下所示:

 public async Task<Form> AddForm(Form form, int currentUserId)
    {
        try
        {
            if (form != null)
            {
                //huidige gebruiker als supplier aanduiden
                Relation r = await GetCurrentUser(currentUserId);
                form.Supplier = r;
                form.SupplierId = r.Id;

                //form aan de db toevoegen
                _datacontext.Form.Add(form);
                _datacontext.SaveChanges();

                return form;
            }
            else
            {
                return null;
            }
        }
        catch (Exception e)
        {
            LogError(e);
            return null;
        }
    }

获取当前用户方法

 private async Task<Relation> GetCurrentUser(int currentUserId)
    {
        var relation = from r in _datacontext.RelationUser
                       where r.UserId == currentUserId
                       select r.Relation;
        return await relation.FirstOrDefaultAsync();
    }

这是我调用 AddForm 方法的地方:

 [HttpPost]
    [Route("addform")]
    [Authorize]
    // api/form/addform
    public async Task<IActionResult> AddForm([FromBody] Form form)
    {
        if (ModelState.IsValid)
        {
            Form f = await _formRepository.AddForm(form, GetUserIdFromToken());

            if(f != null)
            {
                QueueObject qo = new QueueObject()
                {
                    ActionTypeId = 1,
                    FormId = f.Id
                };
                await new QueueHandler().SendMessageToQueue(qo);
            }

            return Ok(f);
        }
        else
        {
            return NotFound("model is niet geldig");
        }
    }

我已经搜索过,但没有发现任何可以解决问题的方法


发生这种情况的另一个可能原因是,如果您在某些调用中超时SaveChanges当尝试将新实体插入数据库时​​,请尝试调用SaveChanges再次,使用相同的DbContext实例。

这是可重现的:

using(var context = new MyDbContext())
{
    context.People.Add(new Person("John"));
    try
    {
        // using SSMS, manually start a transaction in your db to force a timeout
        context.SaveChanges();
    }
    catch(Exception)
    {
        // catch the time out exception
    }
    // stop the transaction in SSMS
    context.People.Add(new Person("Mike"));
    context.SaveChanges(); // this would cause the exception
}

最后这个SaveChanges会导致当 IDENTITY_INSERT 设置为 OFF 时,无法在表“People”中插入身份列的显式值.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架核心:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“关系”中插入标识列的显式值 的相关文章

随机推荐

  • 在 Electron 中禁用网络

    电子 js https electronjs org 是一个用户界面工具包 允许 Web 应用程序作为任意 GUI 运行 然而 有一些应用程序应该被视为敏感 例如 银行业的 GUI 应该有强有力的保证 确保它不会做任何恶作剧 我想知道电子
  • 接收和旋转字符的函数 - 凯撒密码

    我正在尝试创建一个函数 rotate character char rot 接收一个字符 char 长度为 1 的字符串 和一个整数 rot 该函数应返回一个长度为 1 的新字符串 这是将 char 向右旋转 rot 个位数的结果 因此 输
  • 选择小数点后 4 位以上的数字

    我有一个 SQL 表 其中有一个浮点列 其中填充了如下值 1 4313 3 35 2 55467 6 22456 3 325 我需要选择仅包含小数点后 4 位以上的值的行 在这种情况下 选择必须返回 2 55467 6 22456 有想法吗
  • 在 H5PY 中打开文件时出错(未找到文件签名)

    我一直在使用以下代码来打开一些 HDF5 文件 这些文件是在 MATLAB 中使用 H5PY 在 python 中生成的 import h5py as h5 data dataset mat f h5 File data r 但是我收到以下
  • 更大的运算符“">”是否满足严格的弱排序?

    定义 Let lt 是一个二元关系 其中a lt b means a小于b Let gt 是一个二元关系 其中a gt b means a大于b 所以 我们假设 lt and gt 具有我们在日常生活中通常使用的含义 不过 在某些编程语言
  • 有人可以解密这个javascript吗

    我在一个论坛中找到它 告诉我这段代码可以让我自动玩 Facebook 游戏 但我担心这不是他们所说的 我担心这是恶意脚本 请帮忙 javascript var 0x8dd5 x73 x72 x63 x73 x63 x72 x69 x70 x
  • 将 .db 文件导入 R

    我正在尝试使用下面的代码导入 db 文件 该代码与包的示例相同 并且显示找不到函数 有人知道如何导入 db 文件吗 library ProjectTemplate db reader c3 db Users xxx Documents c3
  • 在 Startup.cs .net core 2.1 中加载程序集

    我在名为 nuqkgs 的文件夹中有块包 在项目启动时我想将这些包 有 dll 加载到项目中以在运行时使用 我使用下面的代码来加载它们 当我调试时 我可以看到信息 并且找到并打开了 dll 但是当应该使用它们时 我收到错误 找不到 dll
  • TEdgeBrowser 模态打印对话框?

    TEdge浏览器有替换了 TWebBrowser https docwiki embarcadero com RADStudio Alexandria en Using TEdgeBrowser Component and Changes
  • 更改默认图标工具栏(传单)

    我如何将默认工具栏图标更改为传单上的其他图标 上面的图片显示了图标的默认视图 我想自定义图标并将其更改为其他图标 例如我希望第一个图标看起来像桥梁和第二个文本图标等等 我已经尝试了几种方法但没有成功 这是我的代码 var electricp
  • 在 lapply 函数中访问和保留列表名称

    我需要访问 lapply 函数内的列表名称 我在网上找到了一些线程 据说我应该迭代列表的名称 以便能够获取函数中的每个列表元素名称 gt n names mylist gt mynewlist lapply n function namei
  • 在另一个视图控制器中更改标签的文本

    我有一个名为 FirstViewController 的视图控制器 还有一个名为 SecondViewController 的视图控制器 我提出第二个视图控制器 UIViewController controller self storyb
  • 在 C 中声明和修改字符串

    我最近开始尝试学习C语言 在我的第一个程序 简单的 hello world 事情 中 在我意识到我不能这样做之后 我遇到了声明字符串的不同方法variable name string data char variable name data
  • Solr 和 MySQL,如何保持更新的索引,以及,如果很简单,是否还需要数据库?

    我是 Solr 的初学者 所以请耐心等待 在我当前的项目中 我有一个非常简单的数据库 只有 1 个表 其中包含 4 个字段 id name subject msg 据我了解 每次添加 或删除 新记录时 我都需要将该记录添加到索引中 本质上执
  • 如何计算具有三角形面的网格的质心?

    我想根据以下描述计算网格的新质心 但我不想使用 Blender 的内置函数来计算质心 如所解释的here https blender stackexchange com questions 14294 how to recenter an
  • 如何保存pip包

    我们有一个基于 python django 的 Web 应用程序 其中许多组件都是使用 pip 安装的 所以我想问是否有一种方法可以保存或下载并保存我们正在 pip install 的特定 python 包 例如 pip install d
  • 将 md5 哈希字节数组转换为字符串

    如何将哈希结果 字节数组 转换为字符串 byte bytePassword Encoding UTF8 GetBytes password using MD5 md5 MD5 Create byte byteHashedPassword m
  • 在Java中像表格一样打印二维数组[重复]

    这个问题在这里已经有答案了 我想像表格一样打印输入的二维数组 也就是说 如果出于某种原因他们全都输入 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 就像上面一样 但在 Java Eclipse 的控制台中 没有花哨的按
  • “404 重定向”是合法的重定向吗?

    我遇到的情况是 某些用户可能会通过链接等进入错误输入的页面 在大多数情况下 我可以确定应显示的正确页面 因此我想重定向到正确的 URL 301 重定向适合这种情况吗 301 的意思是 永久移动 但在这种情况下 该文档一开始就不存在 设置 4
  • 实体框架核心:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“关系”中插入标识列的显式值

    我正在构建一个应用程序 当我想将表单插入表单表时 出现以下错误 无法在表 关系 中插入标识列的显式值 当 IDENTITY INSERT 设置为 OFF 时 这些是我的模型 表格型号 DatabaseGenerated DatabaseGe