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
Entity framework DbContext代码优先:创建多个相关实体_Entity Framework_Dbcontext - Fatal编程技术网

Entity framework DbContext代码优先:创建多个相关实体

Entity framework DbContext代码优先:创建多个相关实体,entity-framework,dbcontext,Entity Framework,Dbcontext,我有(我认为是)一个相当标准的问题 在我的经理实体中,我的人员引用自经理 [ForeignKey("PersonID")] public Person Person { get; set; } 我想一次性创建一个新经理 var mgr = new Manager { Person = new Person() }; 此操作失败,出现外键错误,因为此人尚不存在 我通过保存Person并手动将Person ID提供给新经理{PersonID=myNewPerson.ID},完成了这项工作 更新

我有(我认为是)一个相当标准的问题

在我的经理实体中,我的人员引用自经理

[ForeignKey("PersonID")]
public Person Person { get; set; }
我想一次性创建一个新经理

var mgr = new Manager { Person = new Person() };
此操作失败,出现外键错误,因为此人尚不存在

我通过保存Person并手动将Person ID提供给新经理{PersonID=myNewPerson.ID},完成了这项工作

更新


不确定这是否重要,但我的备份数据库是Oracle

实体框架正在做它应该做的事情,强制执行外键约束。试想一下,在SQL中,如果不提供正确的
PersonID
,就无法插入到
管理器
表中。另一种选择是使PersonID成为可为空的外键

public int? PersonID { get; set; }

我认为你面临的问题是数据库对你的人一无所知。首先,您需要告诉您的db,嘿,应该添加此人,然后将其与经理联系起来,如下所示:

var p=newperson();
db.人员添加(p);
var m=新经理{Person=p};
db.Managers.Add(m);
db.SaveChanges();

如果您注意到了,您正在告诉数据库插入记录的顺序。首先,您告诉它添加此人,一旦此人进入数据库,您就可以将其与推送到数据库的其他内容关联起来
DbContext
能够跟踪所有这些逻辑。 这样做,您不需要担心ID,您的实现看起来更像纯OOP


希望这能有所帮助。

通过向新经理添加新人员,EF有足够的信息知道FK指向何处(它依赖于我刚刚创建的人员)。这种添加方式适用于以前保存的父实体,为什么不适用于新的父实体呢?因为您没有将
Person
添加到数据库上下文中。我有点明白你的意思,但是这个功能目前还不存在。为什么,你问?因为它还没有被添加…但EF6是开源的,所以fork和commit!谢谢,但我已经说过这种方法是有效的。我的问题是,考虑到EF拥有所有的关系,为什么它不能在一个语句中工作。这只是一个按正确顺序储蓄的问题。
var p = new Person();
db.Persons.Add(p);
var m = new Manager { Person = p };
db.Managers.Add(m);
db.SaveChanges();