Исполняющая среда EF Core пакетирует операторы создания, обновления и удаления с использованием табличных параметров. Количество операторов, которые пакетирует EF Core, зависит от поставщика баз данных. Например, в SQL Server пакетарование неэффективно для менее 4 и более 40 операторов. Независимо от количества пакетов все операторы по- прежнему выполняются в рамках транзакции. Размер пакета можно конфигурировать посредством DbContextOptions, но в большинстве ситуаций (если не во всех) рекомендуется позволять EF Core рассчитывать размер пакета самостоятельно.

Если бы вы вставляли четыре записи об автомобилях в одной транзакции, как показано ниже:

var cars = new List

{

  new Car { Color = "Yellow", MakeId = 1, PetName = "Herbie" },

  new Car { Color = "White", MakeId = 2, PetName = "Mach 5" },

  new Car { Color = "Pink", MakeId = 3, PetName = "Avon" },

  new Car { Color = "Blue", MakeId = 4, PetName = "Blueberry" },

};

Context.Cars.AddRange(cars);

Context.SaveChanges;

то исполняющая среда EF Core пакетировала бы операторы в одиночное обращение.

Вот как выглядел бы сгенерированный запрос:

exec sp_executesql N'SET NOCOUNT ON;

DECLARE @inserted0 TABLE ([Id] int, [_Position] [int]);

MERGE [Dbo].[Inventory] USING (

VALUES (@p0, @p1, @p2, 0),

(@p3, @p4, @p5, 1),

(@p6, @p7, @p8, 2),

(@p9, @p10, @p11, 3)) AS i ([Color], [MakeId], [PetName], _Position) ON 1=0

WHEN NOT MATCHED THEN

INSERT ([Color], [MakeId], [PetName])

VALUES (i.[Color], i.[MakeId], i.[PetName])

OUTPUT INSERTED.[Id], i._Position

INTO @inserted0;

SELECT [t].[Id], [t].[IsDrivable], [t].[TimeStamp] FROM [Dbo].[Inventory] t

INNER JOIN @inserted0 i ON ([t].[Id] = [i].[Id])

ORDER BY [i].[_Position];

',N'@p0 nvarchar(50),@p1 int,@p2 nvarchar(50),@p3 nvarchar(50),

@p4 int,@p5 nvarchar(50),@p6 nvarchar(50),@p7 int,@p8 nvarchar(50),

@p9 nvarchar(50),@p10 int,@p11 nvarchar(50)',@p0=N'Yellow',@p1=1,

@p2=N'Herbie',@p3=N'White',@p4=2,@p5=N'Mach 5',@p6=N'Pink',@p7=3,

@p8=N'Avon',@p9=N'Blue',@p10=4,@p11=N'Blueberry'

<p id="AutBody_Root938"><strong>Принадлежащие сущностные типы</strong></p>

Возможность применения класса C# в качестве свойства сущности с целью определения коллекции свойств для другой сущности впервые появилась в версии EF Core 2.0 и в последующих версиях постоянно обновлялась. Когда типы, помеченные атрибутом [Owned] или сконфигурированные посредством Fluent API, добавлены в виде свойств сущности, инфраструктура EF Core добавит все свойства из сущностного класса [Owned] к владеющему классу. В итоге увеличивается вероятность многократного использования кода С#.

"За кулисами" EF Core считает результат отношением "один к одному". Принадлежащий класс является зависимой сущностью, а владеющий класс — главной сущностью. Хотя принадлежащий класс рассматривается как сущность, он не может существовать без владеющего класса. Имена столбцов из принадлежащего класса по умолчанию получают формат ИмяНавигационногоСвойства_ИмяСвойстваПринадлежащейСущности (например, PersonalNavigation_FirstName). Стандартные имена можно изменять с применением Fluent API.

Взгляните на приведенный далее класс Person (обратите внимание на атрибут [Owned]):

[Owned]

public class Person

{

  [Required, StringLength(50)]

  public string FirstName { get; set; } = "New";

  [Required, StringLength(50)]

  public string LastName { get; set; } = "Customer";

}

Он используется классом Customer:

[Table("Customers", Schema = "Dbo")]

public partial class Customer : BaseEntity

{

Перейти на страницу:

Похожие книги