#.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;
}
Но вы можете присваивать им значения только вручную.