Desbloqueo del poder de Entity Framework Core: funciones menos conocidas que debe conocer

Apr 01 2023
.

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    [ConvertToUtc]
    public DateTime DateOfBirth { get; set; }
}

public class ConvertToUtcAttribute : Attribute { }

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Property(p => p.DateOfBirth)
            .HasConversion(
                v => v.ToUniversalTime(),
                v => DateTime.SpecifyKind(v, DateTimeKind.Utc)
            )
            .HasAnnotation(nameof(ConvertToUtcAttribute), true);
    }
}

using (var db = new MyDbContext())
{
    var query = db.People
        .Where(p => p.Age > 18)
        .TagWith("MyApp: Adult People Query");

    foreach (var person in query)
    {
        Console.WriteLine($"{person.Name} is an adult.");
    }
}

public class MyDbContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasQueryFilter(p => !p.IsDeleted);
    }
}

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .OwnsOne(p => p.Address);
    }
}

public class PersonSummary
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PersonSummary>(
            eb =>
            {
                eb.HasNoKey();
                eb.ToView("PersonSummaries");
                eb.Property(p => p.Name).HasColumnName("PersonName");
            }
        );
    }
}