Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
C# 实体框架6添加新的导航实体导致;无法插入显式标识";错误_C#_Entity Framework - Fatal编程技术网

C# 实体框架6添加新的导航实体导致;无法插入显式标识";错误

C# 实体框架6添加新的导航实体导致;无法插入显式标识";错误,c#,entity-framework,C#,Entity Framework,-----编辑----- 我的代码正在运行。我尝试了一对多的关系,现在通过使用: newInspection.Sites.Add(newSite) 唯一键约束仍然存在于数据库中,因此我不完全同意将其作为“答案”,因为这更像是一种解决方法。我不知道如何使一对一工作,因为每次我尝试它时(出于测试目的也使用其他表),它总是给我这个错误 ----/编辑----- 我正在开发一个应用程序,首先使用EF6代码。我使用EF6.1工具对代码优先模型进行逆向工程。在尝试向数据库添加新项时,我遇到了1对1关系问题

-----编辑-----

我的代码正在运行。我尝试了一对多的关系,现在通过使用:

newInspection.Sites.Add(newSite)
唯一键约束仍然存在于数据库中,因此我不完全同意将其作为“答案”,因为这更像是一种解决方法。我不知道如何使一对一工作,因为每次我尝试它时(出于测试目的也使用其他表),它总是给我这个错误

----/编辑-----

我正在开发一个应用程序,首先使用EF6代码。我使用EF6.1工具对代码优先模型进行逆向工程。在尝试向数据库添加新项时,我遇到了1对1关系问题

以下是导致问题的对象:

[Table("childTable")]
public partial class Site
{
    [Key]
    public int siteID{ get; set; }

    public int inspectionID { get; set; }

    ...

    public virtual Inspection inspection { get; set; }
}
主要的“检查”课程与现场有一对一的关系,课程组织如下:

[Table("someTable")]
public partial class Inspection
{
    [Key]
    public int inspectionID { get; set; }

    ...

    public virtual Site site { get; set; }
}
上下文定义如下:

modelBuilder.Entity<Inspection>()
            .HasOptional(e => e.site)
            .WithRequired(e => e.inspection);
调用SaveChanges()时,我得到“当identity\u insert设置为OFF时,无法在表'----------'中插入identity列的显式值。”

我无法理解它为什么要这样做,所以我使用db.Database.Log检查生成的SQL,它试图在“Inspection”插入后传递siteID的ID。这对我来说没有意义,因为如果我在调用SaveChanges()之前检查siteID,那么ID应该是0,因为“新”的ID应该是0。然而,它实际上是在尝试插入一个数字,比如16。我不确定它是从哪里得到这个号码的。我认为在向上下文(即db.Inspections.Add())添加一个新项时,它会将其中的所有内容都标记为新的,并在插入过程中将其视为新的

我不知道它为什么要尝试插入ID,但对于任何1对1的导航属性,它似乎都会这样做。这需要显式设置导航属性,而不是使用.Add()方法。一对多对我来说一直都很好(在这种情况下也是如此)


有人知道为什么my DBContext试图传递ID吗?

具有1对1关系的实体在主键中应该具有相同的值。这意味着依赖项中的主键也应该是主体的外键,而不应该是标识字段

您应该根据该要求更改表,以便EF可以插入
检查
对象,然后获取其新ID并将该值作为外键/主键插入
站点
表中

当您迁移回一对一时,EF将添加外键约束,但您需要向迁移中添加sql以删除标识,因为EF还不能这样做(目前)

参考资料:


哇,这是极好的信息。我从来没有想过用这种方式设计数据库。我想这样的想法是有道理的——如果关系总是1:1,那么你就不需要身份栏;1对1关系中的外键始终保持唯一。也感谢您提供的资源,我将阅读更多内容。特别是关于配置与fluent API的关系的文章。事实上,我认为我对fluentapi的理解没有我应该理解的那么多。再次感谢!
        Inspection newInspection = new Inspection
        {
           ...

           site = newSite; // Constructed earlier, no explicit ID. ID = 0 if checked
        };

        using (var db = new Context())
        {
            db.Inspections.Add(newInspection);
            db.SaveChanges();
        }