Po uruchomieniu tego w tabeli Directories mam 3x rekord "Warnes Bros"

class Program {
        static void Main(string[] args) {
            Movie firstMovie = new Movie() { Name = "Titanic" };
            Movie secondMovie = new Movie() { Name = "Pulp Fiction" };
            Movie thirdMovie = new Movie() { Name = "Matrix" };

            Director director = new Director() { Name = "Warner Bros" };

            firstMovie.Director = director;
            secondMovie.Director = director;
            thirdMovie.Director = director;

            Db.AddMovie(firstMovie);
            Db.AddMovie(secondMovie);
            Db.AddMovie(thirdMovie);
        }
    }

    public class Movie {
        public int Id { get; set; }
        public string Name { get; set; }

        public int DirectorId { get; set; }
        [ForeignKey("DirectorId")]
        public virtual Director Director { get; set; }
    }

    public class Director {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual List<Movie> Movies { get; set; }

        public Director() {
            Movies = new List<Movie>();
        }
    }

    public class Db {
        public static int AddMovie(Movie movie) {
            using (var context = new MovieContext()) {
                    context.Movies.Add(movie);
                    context.SaveChanges();
                    return movie.Id;
                }
            }
    }

    public class MovieContext : DbContext {
        public DbSet<Movie> Movies { get; set; }
        public DbSet<Director> Directories { get; set; }
    }

Zmieńmy trochę main i dodajmy metodę AddDirector

class Program {
        static void Main(string[] args) {
            Movie firstMovie = new Movie() { Name = "Titanic" };
            Movie secondMovie = new Movie() { Name = "Pulp Fiction" };
            Movie thirdMovie = new Movie() { Name = "Matrix" };

            Director director = Db.AddDirector("Warner Bros"); //<---------- ZMIENIONA LINIJKA

            firstMovie.Director = director;
            secondMovie.Director = director;
            thirdMovie.Director = director;

            Db.AddMovie(firstMovie);
            Db.AddMovie(secondMovie);
            Db.AddMovie(thirdMovie);
        }
    }

   public class Db {
        public static Director AddDirector(string directorName) {
            using (var context = new MovieContext()) {
                if (context.Directories.Any(x => x.Name == directorName))
                    return context.Directories.FirstOrDefault(x => x.Name == directorName);
                else {
                    Director newDirector = new Director() { Name = directorName };
                    context.Directories.Add(newDirector);
                    context.SaveChanges();
                    return newDirector;
                }
            }
        }
    }

Czyli metoda AddDirector zwraca mi referencję do nowo dodanego obiektu jeśli takiego w bazie nie ma. Jeśli jednak jest już taki director w bazie, to zwraca mi istniejącego. Jednak i tak kicha, bo po uruchomieniu tego nadal do bazy zostają dodane 3x director.

Udało mi się to rozwiązać w ten sposób:

class Program {
        static void Main(string[] args) {
            Movie firstMovie = new Movie() { Name = "Titanic" };
            Movie secondMovie = new Movie() { Name = "Pulp Fiction" };
            Movie thirdMovie = new Movie() { Name = "Matrix" };

            int directorId = Db.AddDirector("Warner Bros");//<---------- ZMIENIONA LINIJKA

            firstMovie.Director.Id = directorId; //<---------- ZMIENIONA LINIJKA
            secondMovie.Director.Id = directorId; //<---------- ZMIENIONA LINIJKA
            thirdMovie.Director.Id = directorId; //<---------- ZMIENIONA LINIJKA

            Db.AddMovie(firstMovie);
            Db.AddMovie(secondMovie);
            Db.AddMovie(thirdMovie);
        }
    }

   public class Db {
        public static int AddDirector(string directorName) {
            using (var context = new MovieContext()) {
                if (context.Directories.Any(x => x.Name == directorName))
                    return context.Directories.FirstOrDefault(x => x.Name == directorName).Id;
                else {
                    Director newDirector = new Director() { Name = directorName };
                    context.Directories.Add(newDirector);
                    context.SaveChanges();
                    return newDirector.Id;
                }
            }
        }
    }

Czyli po prostu zamiast dodawać referencję obiektu dodaję jego id. Jednak czy jest to jedyny sposób? Wydaje mi się, że jest to obejście problemu, niż poprawne rozwiązanie. Macie jakieś rady?