Уникальный первичный ключ с использованием Entity Framework - PullRequest
0 голосов
/ 20 ноября 2018

Я новичок в 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 это сделать?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы уже определили свой столбец 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-firstподход, вы можете объявить это в своей базе данных.

0 голосов
/ 20 ноября 2018

С 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 столбца.

...