Новинки Entity Framework Core 6. Часть 1
1. Атрибут Unicode
Новый атрибут Unicode позволяет сопоставлять строковое свойство со столбцом, отличным от Unicode, без прямого указания типа базы данных. Атрибут Unicode игнорируется, если система баз данных поддерживает только типы Unicode.
public class Book2. Атрибут Precision
{
// …
[Unicode(false)]
public string Title { get; set; }
}
До EF Core 6.0 вы могли настроить точность с помощью Fluent API. Теперь вы можете сделать это также с помощью аннотаций:
public class Product3. Атрибут Column
{
// …
[Precision(precision: 10, scale: 2)]
public decimal Price { get; set; }
}
Помогает указать порядок столбцов в создаваемых таблицах. Также это можно сделать с помощью нового Fluent API — HasColumnOrder().
public class EntityBase4. Атрибут EntityTypeConfiguration
{
[Column(Order = 1)]
public int Id { get; set; }
[Column(Order = 99)]
public DateTime CreatedOn { get; set; }
}
public class Person : EntityBase
{
[Column(Order = 2)]
public string FirstName { get; set; }
[Column(Order = 3)]
public string LastName { get; set; }
}
Помогает EF Core найти и использовать подходящую конфигурацию. До этого нужно было создавать экземпляр конфигурации класса и вызывать его из метода OnModelCreating:
public class ProductConfig :5. Предварительная конфигурация модели
IEntityTypeConfiguration<Product>
{
public void Configure(EntityTypeBuilder<Product> b)
{
b.Property(p => p.Name).HasMaxLength(250);
b.Property(p => p.Price).HasPrecision(10, 2);
}
}
[EntityTypeConfiguration(typeof(ProductConfig))]
public class Product
{
// …
}
Позволяет вам указать конфигурацию сопоставления один раз для данного типа. Это может быть полезно, например, при работе с объектами-значениями.
public class ExampleContext : DbContextЗдесь для поля типа
{
public DbSet<Person> People { get; set; }
protected override void
ConfigureConventions(ModelConfigurationBuilder mcb)
{
mcb.Properties<string>()
.HaveMaxLength(500);
mcb.Properties<decimal>()
.HavePrecision(12, 2);
mcb.Properties<Address>()
.HaveConversion<AddressConverter>();
}
}
Address будет использоваться класс конвертера, сериализующий значение в JSON:public class AddressConverter :Источник: https://blog.okyrylchuk.dev/entity-framework-core-6-features-part-1
ValueConverter<Address, string>
{
public AddressConverter()
: base(
v => JsonSerializer.Serialize(v,
(JsonSerializerOptions)null),
v => JsonSerializer.Deserialize<Address>(v,
(JsonSerializerOptions)null))
{
}
}