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?