EF Core 5: зависимости между моделями

#.net #entity-framework-core #ef-core-5.0

#.net #сущность-фреймворк-ядро #ef-core-5.0

Вопрос:

У меня есть 2 следующие модели: Location и Nominal. Номиналы имеют внешний ключ для определения местоположения, а местоположение может иметь несколько разных номиналов по умолчанию для разных целей.

 public class Nominal
{
    [Key]
    public Guid Id { get; set; }
    public string NominalCode { get; set; }
    public string Description { get; set; }
    public char Analysis { get; set; }

    // link to location

    public Guid LocationId { get; set; }
    public Location Location { get; set; }       

}
 

Модель местоположения выглядит следующим образом;

 public class Location : AutoTracking
{
    [Key]
    public Guid Id { get; set; }
    public int LocationCode { get; set; }
    public string LocationName { get; set; }
    [ForeignKey("Nominal")]
    public Guid? DefaultNominal1Id { get; set; }
    public Nominal DefaultNominal1 { get; set; }
    [ForeignKey("Nominal")]
    public Guid? DefaultNominal2Id { get; set; }
    public Nominal DefaultNominal2 { get; set; }
}
 

Из-за того, что у Nominal уже есть ссылка на местоположение, ссылка обратно из Location в Nominal генерирует ошибку. Предлагаемое решение в ошибке заключается в добавлении атрибута [NotMapped] к свойствам навигации, что я и сделал.

Есть ли какой-либо побочный эффект от добавления не отображенного, я предполагаю, что я все равно смогу загружать свойства навигации с помощью отложенной загрузки EF core?

Комментарии:

1. Почему вы предполагаете, а не проверяете, можете ли вы загрузить свойства навигации? Кроме того, есть ли какая-либо конкретная причина для отказа от использования отношения «один ко многим»?

Ответ №1:

Попробуйте изменить свои классы:

 public partial class Nominal
{
    [Key]
    public Guid Id { get; set; }
    public string NominalCode { get; set; }
    public string Description { get; set; }
    public char Analysis { get; set; }

    // link to location

    public Guid LocationId { get; set; }
   [ForeignKey(nameof(LocationId))]
    [InverseProperty("Nominals")]
    public virtual Location Location{ get; set; }

public partial class Location : AutoTracking
{
    [Key]
    public Guid Id { get; set; }
    public int LocationCode { get; set; }
    public string LocationName { get; set; }
    [InverseProperty(nameof(Nominal.Location))]
     public virtual ICollection<Nominal> Nominals{ get; set; }
}
 

Если по каким-то причинам вам нужно больше свойств, вы можете добавить их таким образом:

 public partial class Location : AutoTracking
{ 
 [NotMapped]
   public Guid? DefaultNominal1Id { get; set; }
 [NotMapped]
    public Nominal DefaultNominal1 { get; set; }
    [NotMapped]
    public Guid? DefaultNominal2Id { get; set; }
 [NotMapped]
    public Nominal DefaultNominal2 { get; set; 
}

 

Но вы можете присваивать им значения только вручную.