EF Core HasMany против OwnsMany - PullRequest
       21

EF Core HasMany против OwnsMany

2 голосов
/ 23 октября 2019

Для отношения один ко многим , в чем разница между HasMany и OwnsMany ? Когда я должен использовать один поверх другого?

Например:

public class xxx 
{
    public virtual IReadOnlyCollection<xxxHistoryEntity> Histories => _histories;
    private readonly List<xxxHistoryEntity> _histories = new List<xxxHistoryEntity>();
}

public class xxxHistoryEntity : Entity<string>
{
    public string State { get; set; }
    public string NodeId { get; set; }
    public string Message { get; set; }
}

Конфигурация объекта:

class xxxConfiguration
    : IEntityTypeConfiguration<xxx>
{
    public void Configure(EntityTypeBuilder<xxx> builder)
    {
        builder.OwnsMany(itm => itm.Histories, collbuilder =>
        {
            collbuilder.HasForeignKey("xxxid");
        });
    }
}

class xxxHistoryConfiguration
    : IEntityTypeConfiguration<xxxHistoryEntity>
{
    public void Configure(EntityTypeBuilder<xxxHistoryEntity> builder)
    {
        builder.ToTable("xxx_histories");
        builder.HasKey(itm => itm.Id);
        builder.Property(itm => itm.Id)
             .ValueGeneratedOnAdd();
    }
}

Сгенерированная миграция ниже:

        migrationBuilder.CreateTable(
            name: "xxx_histories",
            columns: table => new
            {
                id = table.Column<string>(nullable: false),
                xxxid = table.Column<string>(nullable: false),                    
                state = table.Column<string>(nullable: true),
                nodeid = table.Column<string>(nullable: true),
                message = table.Column<string>(nullable: true),
                xmin = table.Column<uint>(type: "xid", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_xxx_histories", x => new { x.id, x.xxxid });
                table.ForeignKey(
                    name: "fk_xxxhistoryentity_xxx_xxxarid",
                    column: x => x.xxxid,
                    principalTable: "xxx",
                    principalColumn: "id",
                    onDelete: ReferentialAction.Cascade);
            });

если я обновлю xxxConfiguration , заменив OwnsMany на HasMany, например:

class xxxConfiguration
    : IEntityTypeConfiguration<xxx>
{
    public void Configure(EntityTypeBuilder<xxx> builder)
    {
        builder.HasMany(itm => itm.Histories)
            .WithOne()
            .HasForeignKey("xxxid");
    }
}

Сгенерированная миграция приведена ниже:

        migrationBuilder.CreateTable(
            name: "xxx_histories",
            columns: table => new
            {
                id = table.Column<string>(nullable: false),
                xxxid = table.Column<string>(nullable: false),
                state = table.Column<string>(nullable: true),
                nodeid = table.Column<string>(nullable: true),
                message = table.Column<string>(nullable: true),
                xmin = table.Column<uint>(type: "xid", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_xxx_histories", x => new { x.id, x.xxxid });
                table.ForeignKey(
                    name: "fk_xxxhistoryentity_xxx_xxxid",
                    column: x => x.xxxid,
                    principalTable: "xxx",
                    principalColumn: "id",
                    onDelete: ReferentialAction.Cascade);
            });

Как выМожно видеть, что миграция, генерируемая обоими, одинакова. Так в чем смысл OwnsMany?

1 Ответ

0 голосов
/ 23 октября 2019

Из документации:

EF Core позволяет моделировать типы объектов, которые могут появляться только в навигационных свойствах других типов объектов. Это так называемые типы объектов. Сущность, содержащая принадлежащий ей тип сущности, является ее владельцем.

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

https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...