Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 实体框架似乎在父对象之前保存子对象_C#_.net_Entity Framework_Entity Framework 6_Dbcontext - Fatal编程技术网

C# 实体框架似乎在父对象之前保存子对象

C# 实体框架似乎在父对象之前保存子对象,c#,.net,entity-framework,entity-framework-6,dbcontext,C#,.net,Entity Framework,Entity Framework 6,Dbcontext,我使用的是实体框架6.2,代码优先。我有两门课: public class Agent { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int? AgentId { get; set; } public string FirstName { get; set; } public string Surname { get; set

我使用的是实体框架6.2,代码优先。我有两门课:

public class Agent
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int? AgentId { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public int OfficeId { get; set; }
        [ForeignKey("OfficeId")]
        public virtual Office Office { get; set; }        
    }

公共班级办公室
{
[关键]
[数据库生成(DatabaseGeneratedOption.None)]
public int OfficeId{get;set;}
公共字符串代理{get;set;}
公共字符串分支{get;set;}
[反向财产(“办公室”)]
公共虚拟ICollection代理{get;set;}
}
因此,每个代理都属于一个办公室(并且只有一个办公室)。相反,一个办公室可以包含许多代理

我的应用程序连接到一个web API,它向代理和办公室提供XML数据(我使用XDocument)。然后用这些对象填充DbContext,并调用DbContext.SaveChanges()

在这一点上,我得到了以下错误:

“无法添加或更新子行:外键约束失败 (
fusion
agent
,CONSTRAINT
FK\u agent\u office\u OfficeId
外键 (
OfficeId
)上的删除级联上的引用
office
OfficeId
) 更新级联“

在我看来,英孚似乎在办公室前试图拯救特工。因此,当它将第一个代理写入数据库时,没有相应的办公室,事务失败。我可以想象EF会计算出事物的正确顺序(基于导航属性),并以正确的顺序保存事物

现在,我需要指出,当我的应用程序将代理和办公室添加到DbContext中时,它首先添加代理,然后添加办公室-这可能就是为什么EF也以相同的顺序将它们插入数据库。不幸的是,当我的应用程序调用Web API时,API会先向代理发送XML数据,然后再向Office发送数据


如何让EF在代理之前保存办公室?

EF根据导航属性确定正确的顺序。还有别的问题。有几件事可能是问题所在

为什么要使用
[DatabaseGenerated(DatabaseGeneratedOption.None)]
?您是在创建和维护ID还是数据库?如果它是数据库,您不想
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

代理上是否还有可为空的主键?对吗?主键不能/不应该为空


对于正常的1对多关系,不需要设置
[InverseProperty(“Office”)]
。这可能会让人困惑

若代理表引用的是Office表的主键,那个么EF将首先创建Office行,以便它的ID可以插入到新的代理行中。EF不仅可以查看导航属性,还可以查看如何从db映射推断导航属性。是否可以在添加到上下文的位置添加代码?如果要添加新的“代理和办公室”或仅添加代理,则会出现此问题?
public class Office
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int OfficeId { get; set; }
        public string Agency { get; set; }
        public string Branch { get; set; }
        [InverseProperty("Office")]
        public virtual ICollection<Agent> Agents { get; set; }
    }