ef 核心:使用 OwnsMany 映射值对象需要定义主键

use*_*862 5 .net c# entity-framework-core

我有一堂课

public class Document
{
    public string TranId { get; set; }        
    public Record Record { get; set; }
    public List<Error> Errors { get; set; }
}

public class Record
{
    public string TranId { get; set; }    
    public List<DataResult> DataResults { get; set; }
}

public class DataResult
{
    public string DataSourceName { get; set; }
    public List<DataField> DataFields { get; set; }
    public List<CustomField> CustomFields { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

我想将 Record 和 DataResult 类映射为 Value 对象,所以我尝试映射为

public void Configure(EntityTypeBuilder<Document> builder)
{
    builder.ToTable("Document");
    builder.HasKey(x => x.TranId);

    builder.OwnsOne(a => a.Record, a =>
    {
        a.ToTable("Doc_Record");
        a.Property(p => p.TranId).HasMaxLength(100)
            .HasColumnName("TranID")
            .HasDefaultValue("");                          
            a.OwnsMany(x => x.DataResults, x =>
                {
                    x.ToTable("Doc_Rec_DataResults");
                    x.Property(p => p.DataSourceName).HasMaxLength(150)
                        .HasColumnName("DataSourceName")
                        .HasDefaultValue("");                                   
                });
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试添加此迁移时,它会出错并显示一条消息:

实体类型“DataResult”需要定义一个主键。

  • 为什么它需要主键,因为我试图将其映射为值对象?

有人建议使用此链接,我尝试添加

a.OwnsMany(x => x.DataResults, x =>
{
    x.WithOwner().HasForeignKey("RecordId");
    x.ToTable("Doc_Rec_DataResults");
    x.Property(p => p.DataSourceName).HasMaxLength(150)
    .HasColumnName("DataSourceName")
    .HasDefaultValue("");                                   
});
Run Code Online (Sandbox Code Playgroud)

但是这种方法不起作用,因为WithOwner可以从.net core 3我使用的地方获得.net core 2(我是否真的需要将RecordId属性添加到Record类中(它是一个值对象)。

如果有人可以提供一个示例,说明如何使用OwnsManyin映射值对象的集合,那就太好了EF Core 2

MHD*_*uke 3

在这个 ef core 2.2示例中,我们有一个Company拥有 的集合Addresses,这是实现。请注意,我省略了一些有用的代码来坚持要点,请参阅完整的示例以获取进一步的解释。另请注意,此功能OwnsMany()在 ef core 2.2 之前版本中不可用

public class CompanyAddress
{   
    public string City { get; }

    public string AddressLine1 { get; }
}


public class Company
{
    private List<CompanyAddress> addresses = new List<CompanyAddress>();

    public Guid Id { get; }

    public string Name { get; }

    public IEnumerable<CompanyAddress> Addresses { get => this.addresses; }

    public void AssignAddress(CompanyAddress address)
    {
        var exists = this.addresses.Contains(address);

        if (!exists)
        {
            this.addresses.Add(address);
        }
    }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>().OwnsMany<CompanyAddress>("Addresses", a =>
    {
        a.HasForeignKey("CompanyId");
        a.Property(ca => ca.City);
        a.Property(ca => ca.AddressLine1);
        a.HasKey("CompanyId", "City", "AddressLine1");
    });
}
Run Code Online (Sandbox Code Playgroud)

这是文章所有者的完整解决方案的存储库