Как определить отношение один ко многим только на зависимом объекте и сделать его обязательным - PullRequest
0 голосов
/ 30 сентября 2019

У меня проблема с настройкой отношения один-ко-многим в ef core 2.2. У меня следующий сценарий (сущности разные, но это не актуально). Проблема:

Этот класс уже существует в базе кода, и я не могу его коснуться

public class Order : Entity {
//    public ICollection<OrderLine> Orders; // I would like to have it but I don't and I can't
}

Мне нужно добавить этот класс:

public class OrderLine: Entity {
    public Order Order { get; set; } //I have only this
}

Мне нужен технический совет. Я написал конфигурацию для класса:

public void Configure(EntityTypeBuilder<OrderLine> builder)
{
    builder.HasKey(x=>x.Id);
    builder.Property(x=>x.Order).IsRequired();
}

Это, к сожалению, дает мне следующую ошибку при добавлении миграции:

Свойство 'Order.OrderLine' имеет тип'OrderLine', который не поддерживается текущим поставщиком базы данных. Либо измените тип свойства CLR, либо игнорируйте свойство, используя атрибут «[NotMapped]» или «EntityTypeBuilder.Ignore» в «OnModelCreating».

Когда я удаляю строку: builder.Property(x=>x.Order).IsRequired();поле становится обнуляемым, что недопустимо.

Я использовал следующую уловку:

builder.Ignore(x => x.Order);
builder.HasOne<Order>().WithMany().IsRequired().OnDelete(DeleteBehavior.Restrict);

Но затем, когда я устанавливаю поле Order при построении OrderLine, я получаю исключение при сохранении в базу данных, потому что OrderId получает значение по умолчанию (этоигнорируется). Есть ли способ решить эту проблему?

1 Ответ

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

Вам необходимо изменить OrderLine class.

public class OrderLine: Entity 
{
    public int Id {get;set;} // EF requires primary key, remove if it is declared in Entity base class
    public int OrderId {get;set;} //Foreign Key

    public virtual Order Order { get; set; } // Navigational Property for eager and lazy loading. it should be virtual
}

И не нужно предоставлять гибкую конфигурацию, по соглашению, это создаст отношения один-ко-многим, и OrderLine должен иметь ссылку на OrderId.

...