Настройка ключей

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core 7

Последнее обновление: 15.11.2020

По умолчанию в качестве ключа используется свойство, которое называется Id или [имя_класса]Id. Например:

public class User
{
    public int Id { get; set; }
    //.........................
}

или

public class User
{
    public int UserId { get; set; }
    //.........................
}

Для установки свойства в качестве первичного ключа с помощью аннотаций применяется атрибут [Key]:

public class User
{
	[Key]
    public int Ident { get; set; }
    public string Name { get; set; }
}

Для конфигурации ключа с Fluent API применяется метод HasKey():

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
	public ApplicationContext()
	{
		Database.EnsureDeleted();
		Database.EnsureCreated();
	}
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasKey(u => u.Ident);
    }
	protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }
}
public class User
{
    public int Ident { get; set; }
    public string Name { get; set; }
}

С помощью Fluent API можно создать составной ключ из нескольких свойств:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
	public ApplicationContext()
	{
		Database.EnsureDeleted();
		Database.EnsureCreated();
	}
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasKey(u => new { u.PassportSeria, u.PassportNumber});
    }
	protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }
}

public class User
{
    public string PassportNumber { get; set; }
    public string PassportSeria { get; set; }

    public string Name { get; set; }
}

Составной ключ можно создать только с помощью Fluent API. Применение подобного ключа:

using (ApplicationContext db = new ApplicationContext())
{
    db.Users.Add(new User { PassportSeria = "1234", PassportNumber = "345678", Name="Tom" });
    db.Users.Add(new User { PassportSeria = "1234", PassportNumber = "345679", Name="Bob" });
    db.SaveChanges();

    var users = db.Users.ToList();
    foreach (var u in users)
        Console.WriteLine($"{u.Name} : {u.PassportSeria} {u.PassportNumber}");
}

Дополнительно с помощью Fluent API можно настроить имя ограничения, которое задается для первичного ключа. Для этого применяется метод HasName():

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
	public ApplicationContext()
	{
		Database.EnsureDeleted();
		Database.EnsureCreated();
	}
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasKey(u => u.Id).HasName("UsersPrimaryKey");
    }
	protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }
}

Альтернативные ключи

Альтернативные ключи представляют свойства, которые также, как и первичный ключ, должны иметь уникальное значение. В то же время альтернативные ключи не являются первичными. На уровне базы данных это выражается в установке для соответствующих столбцов ограничения на уникальность.

Для установки альтернативного ключа используется метод HasAlternateKey():

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
	public ApplicationContext()
	{
		Database.EnsureCreated();
	}
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasAlternateKey(u => u.Passport);
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Passport { get; set; }
}

В данном случае свойство Passport (серия и номер паспорта) будет альтернативным ключом. Созданная таблица Users в итоге будет описываться следующим SQL-скриптом:

CREATE TABLE [dbo].[Users] (
    [Id]       INT            IDENTITY (1, 1) NOT NULL,
    [Name]     NVARCHAR (MAX) NULL,
    [Passport] NVARCHAR (450) NOT NULL,
    CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [AK_Users_Passport] UNIQUE NONCLUSTERED ([Passport] ASC)
);

Альтернативные ключи также могут быть составными:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
	public ApplicationContext()
	{
		Database.EnsureDeleted();
		Database.EnsureCreated();
	}
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasAlternateKey(u => new { u.Passport, u.PhoneNumber });
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Passport { get; set; }
    public string PhoneNumber { get; set; }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850