В моем приложении Movies
хранятся в БД.Эти Movies
имеют Name
и Director
.
Хорошо известно, что любой человек с таким же Name
, как и другой человек, является тем же лицом.Я хотел бы реализовать это ограничение в приложении.
Моя модель:
public class MovieContext: DbContext
{
public MovieContext(): base("name=testDB") { }
public DbSet<Movie> Movies { get; set; }
public DbSet<Director> Revenues { get; set; }
}
public class Movie
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual Director Director { get; set; }
}
public class Director
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
И мое приложение
static void Main()
{
Director directorA = new Director()
{
Name = "A"
};
Movie movie1 = new Movie()
{
Name = "foo",
Director = directorA
};
Movie movie2 = new Movie()
{
Name = "bar",
Director = directorA
};
using (var context = new MovieContext())
{
context.Movies.Add(movie1);
context.SaveChanges();
}
using (var context = new MovieContext())
{
context.Movies.Add(movie2);
context.SaveChanges();
}
}
(Я избавляюсь от контекстамежду двумя вставками для имитации двух разных запусков программы).
При выполнении этого в таблице Directors
создаются две строки:
Id Name
1 A
2 A
Поскольку директор 1 и директор 2 имеют одинаковыеимя, это один и тот же человек, и поэтому я предпочел бы иметь одну строку.
Я попытался использовать индекс для этого и изменил мою Director
модель:
public class Director
{
[Key]
public int Id { get; set; }
[Index(IsUnique =true), StringLength(30)]
public string Name { get; set; }
}
Однако, это выбрасывает во время выполнения, так как EF пытается вставить одну и ту же строку дважды.Это явно не правильный способ сделать это.
Как правильно сделать так, чтобы идентичные посторонние объекты имели одинаковый идентификатор при вставке данных в Entity Framework?