ef core: отображение объекта значения с использованием OwnsMany требует определения первичного ключа - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть класс

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; }        
}

Я хочу отобразить классы 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("");                                   
                });
    }
}

Когда я пытаюсь добавить эту миграцию,ошибки с сообщением:

Тип сущности '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("");                                   
});

, но этот подход не работает, причина WithOwner доступно из .net core 3, где я использую .net core 2 (и мне действительно нужно добавить свойство RecordId в класс Record (это объект значения).

Itбыло бы здорово, если бы кто-нибудь смог привести пример того, как сопоставить коллекцию объектов-значений с OwnsMany в EF Core 2.

1 Ответ

0 голосов
/ 28 сентября 2019

В этом примере ядра 2.2 у нас есть Company, которому принадлежит коллекция Addresses, вот реализация.обратите внимание, что я пропустил некоторый полезный код, чтобы придерживаться точки, обратитесь к полному примеру для дальнейшего объяснения.Также обратите внимание, что эта функция OwnsMany() недоступна в ядре 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");
    });
}

. Это репозиторий полного решения для владельца статьи

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