Конечно, новый режиссер не сохраняется, потому что вы изменили режиссера нового фильма на существующего в какой-то момент в своем коде, попробуйте этот, и вы оба сохраните их в БД:
var movie = new Movie();
movie.Name = "ABCD";
ctx.Movies.Add(movie);
movie.Director = new Director() { Name = "dir1" };
//movie.Director = existingDirector;
ctx.SaveChanges();
Вы можете написать свою собственную логику исправления ассоциаций, но она позаботится о синхронизации конечных точек ваших ассоциаций и не будет иметь ничего общего с кодом, который вы здесь показали.
Причина, по которой ваш код сохраняет нового директора в БД при использовании EntityObjects, заключается в концепции, которая называется Relationship Span . Диапазон отношений определяет, что
ObjectContext автоматически присоединит сущность, когда вы присоедините ее к другой присоединенной сущности. Если этот отдельный объект является новым, когда он присоединен к контексту, будет добавлен его EntityState. Однако это поведение отношения отношений не реализуется, даже если вы используете прокси-серверы POCO (т. Е. Виртуальные свойства навигации).