Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 当identity“insert”设置为OFF时,无法在表中插入identity列的显式值;_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

Sql server 当identity“insert”设置为OFF时,无法在表中插入identity列的显式值;

Sql server 当identity“insert”设置为OFF时,无法在表中插入identity列的显式值;,sql-server,asp.net-core,entity-framework-core,Sql Server,Asp.net Core,Entity Framework Core,对于我的API,我使用实体框架核心进行代码优先迁移。我已经建立了一些良好的关系。现在,我添加了另一个关系(一对多),突然我被这个错误打了耳光: 当identity\u insert设置为OFF时,无法在表“COMPANY”中为identity列插入显式值。“ 当然,我一定是做错了什么,但我就是不知道是什么。我遇到了更多类似这样的问题,答案是“设置标识插入为开”,但这对我来说不起作用,因为EF正在处理所有事情 可以属于某个组的我的公司类别: 上市公司 { //主键 公共int Id{get;set

对于我的API,我使用实体框架核心进行代码优先迁移。我已经建立了一些良好的关系。现在,我添加了另一个关系(一对多),突然我被这个错误打了耳光:

当identity\u insert设置为OFF时,
无法在表“COMPANY”中为identity列插入显式值。“

当然,我一定是做错了什么,但我就是不知道是什么。我遇到了更多类似这样的问题,答案是“设置标识插入为开”,但这对我来说不起作用,因为EF正在处理所有事情

可以属于某个组的我的公司类别:

上市公司
{
//主键
公共int Id{get;set;}
//组的可选Id
public int?GroupID{get;set;}
...
}
小组课:

公共类组
{
//主键
公共int Id{get;set;}
//小组名称
公共字符串名称{get;set;}
//此组中的公司列表
公共IEnumerable公司{get;set;}
}
用于处理该职位的代码:

//发布api/组
[HttpPost]
公共异步任务发布([FromBody]组)
{
尝试
{
if(ModelState.IsValid)
{
_context.Groups.Add(组);
wait_context.SaveChangesAsync();
返回CreatedAtRoute(“GetGroup”,new{id=group.id},group);
}
返回请求(ModelState);
}
捕获(例外e)
{
返回BadRequest($“无法创建:{e.Message}”);
}
}
在我的数据库中,所有列、索引和键都是按预期创建的,就像我在API中得到的每一个一对多关系一样。但这个特定的例子似乎最终陷入了困境

我试图添加到数据库中的类:


这是因为在设置为标识(自动递增)的列中传递某些值


我认为您正在插入的
实体具有Id值的公司,它试图将Id值作为子记录插入到公司表中。并且它抛出了一个错误。

问题是EF没有提示知道
公司
(在
关系下)正在显式插入,或者应该使用数据库中预先存在的

由于这些实例与
DbContext
断开连接,因此在EF尝试生成其SQL命令时,没有指示它们是否存在于数据库中

这里没有简单的方法,至少在我玩EF Core的时候没有

你应该:

  • 将代码更改为仅使用
    ID
    而不是导航属性,以便尽可能避免使用该属性,或者
  • 在保存所需数据之前(例如:在保存
    组之前),更改代码以获取相关数据(例如:获取
    公司
    并将其附加到
  • 例如:

    var companyDB=wait context.companys.SingleOrDefaultAsync(c=>c.Id==group.Company.Id);
    group.Company=companyDB;
    context.Groups.Add(组);
    wait context.saveChangesSync();
    
    是的,您要两次访问数据库。这就是我建议使用第一种方法的原因,这样您就可以避免这种获取,只需将
    实体直接保存到数据库中

    但是,这并不禁止您向视图发送
    Company
    的导航装置。只需创建一些与实体相关的类,这些类将与数据库关联,以便您可以使用此实体类型加载/保存数据,并创建一个
    Dto
    对象,该对象将在需要时作为端点输入/输出


    可以使用自动映射、手动linq或其他方法将一个实体绑定到另一个实体。

    我在尝试保存一个实体(例如,
    Cat
    )时遇到了类似的问题,该实体与现有实体(property
    Owner
    ,指向
    Person
    )存在多对一关系。此外,还有a)获取关系(Person)在保存实体(
    Cat
    )之前从数据库中,以及b)向实体(
    Cat
    )添加另一个属性(
    int-PersonId
    ),我发现了我认为最好的解决方案:c)只使用“导航”属性(不要创建额外的
    int-Id
    属性),当需要引用时,使用
    cat.Owner=dbContext.Person.Attach(new Person{Id=123}).Entity;

    由于某种原因,Entity Framework失去了跟踪,Entity Framework需要重新建立对已经存在的实体的跟踪

    您可以通过以下方式获取实体跟踪的状态:

    var entityTrackingState = _context.Entry(entity).State;
    
    您可以通过以下方式强制实体框架对现有实体进行跟踪:

    _context.Entry(untrackedEntity).State = EntityState.Unchanged;
    
    在哪里

    是一个实体框架DbContext


    强制跟踪解决了我的问题,但它确实应该在实体框架失去跟踪的地方进行调试。

    你能发布代码吗,哪个部分出现异常?我已经更新了问题,你需要确保实体
    公司
    的EF映射和表
    公司
    的DB架构对齐。如果你想t要使用IDENTITY进行插入,请确保表架构设置为
    IDENTITY\u insert
    ,并且映射已配置为IDENTITY insert(最后一部分可能是您的问题)。如果您不想使用它,请确保在属性中传递显式值。错误很简单。您首先尝试创建组时传递的是组的id。id是一个自动递增的主键,因此id来自数据库,而不是您。不要设置显式id,您就可以了@ChrisPratt这听起来很简单,但问题是我没有设置一个显式id,EF处理所有事情…你的解决方案的第2个是这个特定问题的实际解决方案
    _context