На самом деле вам не нужны значения идентификаторов для создания отношений между двумя объектами, вот где поддержка ORM для свойств навигации становится удобной:
var o1 = new Object() { ...
var o3 = new Object3() { ...
o3.Object = o1;
this.db.Objects3.Add( o3 );
this.db.SaveChanges();
EF должен заметить, что у вашего свойства навигации есть объект на другом конце, и сохранить его в базе данных в правильном порядке, и установить оба идентификатора соответствующим образом.
Однако, если вы настаиваете на наличии идентификатора в явном виде, вы должны сначала сохранить изменения, чтобы идентификатор был установлен в объекте
var o1 = new Object() { ...
this.db.Objects.Add( o1 );
this.db.SaveChanges();
var id = o1.ID;
Теперь вы можете использовать свой идентификатор в явном виде.
Дополнительное замечание - в ваших навигационных свойствах отсутствует модификатор virtual
, это делает невозможным для EF заменить реализацию по умолчанию на реализацию с отложенной загрузкой для объектов, которые материализуются при выполнении запросов к базе данных.
public class Object
{
public Object()
{
this.Objects3 = new List<Object3>();
}
public virtual ICollection<Object3> Objects3 { get; set; }
}
public class Object3
{
public virtual Object Object { get; set; }
}