EF core 在单个表中存储相同类型(值对象)的多个集合属性的配置

问题描述 投票:0回答:1

现在我意识到这对我来说很难做到。

鉴于:

EF Core 8

// мodels are simplified to highlight the essence

public class Notification
{
    public Guid Id { get; set; }
    public EmailAddress From { get; set; }
    
    public ICollection<EmailAddress> To { get; set; }
    public ICollection<EmailAddress> Cc { get; set; }
    public ICollection<EmailAddress> Bcc { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

public class EmailAddress
{
    public string DisplayName { get; set; }
    public string Address { get; set; }
}

需要进行一些配置,使所有地址的电子邮件最终都出现在同一个表中,并且可能带有一些鉴别器列。喜欢

通知表

id 来自 主题 身体

电子邮件地址表

id notification_id 抄送 密件抄送 鉴别器

或更佳

id notification_id 地址 鉴别器
c# entity-framework-core discriminator owned-types
1个回答
0
投票

您可以使用带有鉴别器的每个层次结构表功能来执行此操作。

扩展

EmailAddress
使每个集合都有一个类型:

public class ToEmailAddress : EmailAddress { }
public class CcEmailAddress : EmailAddress { }
public class BccEmailAddress : EmailAddress { }

修改

Notification
使用新类型:

    public ICollection<ToEmailAddress> To { get; set; }
    public ICollection<CcEmailAddress > Cc { get; set; }
    public ICollection<BccEmailAddress> Bcc { get; set; }

更新

EmailAddress
的模型配置以注册新类型和所需的鉴别器:

    modelBuilder.Entity<EmailAddress>()
        .HasDiscriminator<string>("discriminator")
        .HasValue<EmailAddress>("base")
        .HasValue<ToEmailAddress>("to")
        .HasValue<CcEmailAddress>("cc")
        .HasValue<BccEmailAddress>("bcc");
© www.soinside.com 2019 - 2024. All rights reserved.