По умолчанию модель включает все свойства сущности, которые определены как публичные и которые открыты для записи и чтения. Например,
public class User { public int Id { get; set; } public string? Name { get; set; } public int Age { get; set; } }
Класс User имеет три публичных свойства, поэтому при чтении или записи в базу данных Entity Framework будет автоматически сопоставлять столбцы из таблицы с этими свойствами по имени. Но такое поведение не всегда необходимо. Иногда требуется, наоборот, исключить определенное свойство, чтобы для него не создавался столбец в таблице.
Исключение с помощью Fluent API производится через метод Ignore():
using Microsoft.EntityFrameworkCore; public class ApplicationContext : DbContext { public DbSet<User> Users { get; set; } = null!; public ApplicationContext() { Database.EnsureDeleted(); Database.EnsureCreated(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=helloapp.db"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>().Ignore(u=>u.Address); } } public class User { public int Id { get; set; } public string? Name { get; set; } public int Age { get; set; } public string? Address { get; set; } }
Здесь свойство Address исключается из модели, и для него не будет создаваться столбец в таблице Users.
Исключение с помощью аннотаций данных:
using System.ComponentModel.DataAnnotations.Schema; public class User { public int Id { get; set; } public string? Name { get; set; } public int Age { get; set; } [NotMapped] public string? Address { get; set; } }
В обоих случаях при миграции будет создана таблица Users, которая не будет содержать столбца для свойства Address, и оно не будет участвовать в сопоставлениях при операциях с бд:
В примере выше применялись автосвойства, которые представляют сокращенную версию свойств без полноценных блоков get и set. Однако свойства не обязательно должны представлять именно автосвойства. Для хранения значений они могут использовать поля класса и иметь полноценные блоки get и set. Например:
public class User { string name; public int Id { get; set; } public string Name { get { return name; } set { name = value; } } public int Age { get; set; } }