Я новичок в EF. Допустим, у меня есть таблица в БД, например:
ID FirstName LastName DateOfBirth
-------------------------------------------
1 John Smith 1.1.1990
2 Mary Wilson 5.1.1991
Теперь я вставляю новую сущность в таблицу, используя EF:
dbcontext.Persons.Add(new Person
{
FirstName = "John",
LastName = "Smith",
DateOfBith = "1.1.1990"
});
dbcontext.SaveChanges();
Мне нужен код, чтобы вызвать исключение, потому что эта строка уже существует в базе данных, но EF делает то, что она увеличивает столбец ID на 1 и создает новую запись:
ID FirstName LastName DateOfBirth
--------------------------------------------
1 John Smith 1.1.1990
2 Mary Wilson 5.1.1991
3 John Smith 1.1.1990
EF даже способен на это?
Вы уже определили свой столбец ID
как столбец идентификаторов, и он считается вашим первичным ключом и будет увеличиваться на единицу при каждом добавлении новой записи в таблицу. Вот почему вам разрешено вставлять повторяющиеся объекты. Вам нужно указать, какой столбец нужно объявить как PK, либо в вашей модели, если вы используете подход с первым кодом и с помощью аннотации данных, что-то вроде этого:
[Key]
public string FirstName { get; set; }
Или с помощью уникального ограничения:
[Index("IX_UniqueConstraint", 1, IsUnique = true)]
public string FirstName { get; set; }
[Index("IX_UniqueConstraint", 2, IsUnique = true)]
public string LastName { get; set; }
[Index("IX_UniqueConstraint", 3, IsUnique = true)]
public DateTime DateOfBirth { get; set; }
Вы также можете использовать свободный API для этой цели:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Persons>().HasKey(c => new { c.FirstName, c.LastName, c.DateOfBirth });
}
Или, если вы используете подход, основанный на DB, вы можете объявить его в своей базе данных.
С EF вам нужно будет сделать что-то вроде этого:
[Index("IX_UniqueConstraint", 1, IsUnique = true)]
public string FirstName { get; set; }
[Index("IX_UniqueConstraint", 2, IsUnique = true)]
public string LastName { get; set; }
[Index("IX_UniqueConstraint", 3, IsUnique = true)]
public DateTime DateOfBirth { get; set; }
Это наложит уникальное ограничение на 3 столбца.