在我的应用程序中,我想为导演分配电影。当然,没有必要存储重复的导演,所以我需要防止添加重复的行。防止添加重复值
我记得有昔日乐趣sql server
和该诀窍:
1. Get Director Id
1a. If director exist return existing director Id
1b. If director not exist add new and return added director Id
2. Add new Movie with directorId assigned.
我刚学Entity Framework
,我不能那样做。我必须改变我作为集合来查看数据库的方式。因此,我将Director
添加到Movie
。我不知道如果我解释说,正确的,所以我认为这将是更好地展示代码:
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; }
}
而且事情是之后,我有3次同样的Director
在我的数据库。我预计只有1个。但是,我该怎么实现呢?如何防止添加相同的Directories
?我的意思是我不能检查是否已经有directory
同名,因为我没有手动添加它们。 Entity Framework
增加新的Directory
,不是我。那么,我能用它做什么?
我已经管理的是添加directorId
并让实体框架分配适当的对象。这就是我改变main
:
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.GetDirector("Warner Bros");
firstMovie.DirectorId = director.Id;
secondMovie.DirectorId = director.Id;
thirdMovie.DirectorId = director.Id;
Db.AddMovie(firstMovie);
Db.AddMovie(secondMovie);
Db.AddMovie(thirdMovie);
}
这就是我将返回Director
(添加如果有必要),新方法
public static Director GetDirector(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;
}
}
}
所以它是做它的最好方法是什么?我不确定是否添加新的Director
是正确的编码。你有什么建议吗?
谢谢。第二个策略似乎对我来说是最明智的。 – Dawvawd