C# 实体框架似乎在父对象之前保存子对象
我使用的是实体框架6.2,代码优先。我有两门课: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
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
,CONSTRAINTFK\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; }
}