Укажите связь в EF Core с другим именем

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня проблема со следующей связью в EF Core 3.1.8. У меня есть следующие классы:

 public class UnitOfMeasure
{
    public UnitOfMeasure(string Code, string Description)
    {
        this.Code = Code;
        this.Description = Description;
    }
    public int Id { get; private set; }
    public string Code { get; private set; }
    public string Description { get; private set; }
}

public class Article
{
    private Article() { }
    public Article(string Code, string Description, UnitOfMeasure BaseUnitOfMeasure)
    {
        this.Code = Code;
        this.Description = Description;
        this.BaseUnitOfMeasure = BaseUnitOfMeasure;
        this.BaseUnitOfMeasureId = BaseUnitOfMeasure.Id;
    }
    public int Id { get; private set; }
    public string Code { get; private set; }
    public string Description { get; private set; }
    public int BaseUnitOfMeasureId { get; private set; }
    public UnitOfMeasure BaseUnitOfMeasure { get; private set; }
}

internal class ArticleConfiguration : IEntityTypeConfiguration<Article>
{
    public void Configure(EntityTypeBuilder<Article> builder)
    {
        builder.HasIndex(a => a.Code)
            .IsUnique();

        builder.HasOne(a => a.BaseUnitOfMeasure)
            .WithMany()
            .HasForeignKey(a => a.BaseUnitOfMeasureId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

public class WmsDbContext : DbContext
{
    public WmsDbContext(DbContextOptions options)
        : base(options)
    {
        ChangeTracker.LazyLoadingEnabled = false;
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
        {
            builder.ApplyConfigurationsFromAssembly(assembly);
        }

        base.OnModelCreating(builder);
    }
}
 


Когда я запускаю это, я получаю следующую ошибку: : «Невозможно определить связь, представленную свойством навигации». Статья.BaseUnitOfMeasure’ типа ‘UnitOfMeasure’. Либо вручную настройте связь, либо игнорируйте это свойство, используя атрибут ‘[NotMapped]’ или используя EntityTypeBuilder.Игнорировать’в ‘OnModelCreating’.’

Это сводит меня с ума. Я не могу найти ничего, чтобы заставить отношения работать. Я не хочу указывать другую сторону отношения в классе UnitOfMeasure, потому что это не имеет смысла в моей области.

Как я могу добавить свойство навигации с именем, отличным от имени класса?

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

1. Вы уверены, что ArticleConfiguration.Configure это вызывается из OnModelCreating ?

2. Какую версию Entity Framework вы используете?

3. Я использую ядро EF 3.1.8. и я знаю эту конфигурацию ArticleConfiguration. Configure вызывается, потому что я установил точку останова внутри и запустил ее в режиме отладки.

4. Не могли бы вы предоставить нам еще немного кода, пожалуйста? Например, когда это выдает ошибку?

5. Я добавил свой класс DbContext. Исключение генерируется в конструкторе. Я проверил в отладчике, что мой метод configure выполняется первым, хотя,

Ответ №1:

Ваша связь — это одна единица измерения со многими статьями, верно? Если это так, вы можете просто добавить следующий код в класс UnitOfMeasure:

 public ICollection<Article> Articles { get; set; }
 

и измените конструктор.Имеет один такой:

 builder.HasOne(d => d.BaseUnitOfMeasure)
       .WithMany(p => p.Articles)
       .HasForeignKey(d => d.BaseUnitOfMeasureId)
       .OnDelete(DeleteBehavior.Restrict)
       .HasConstraintName("FK_Articles_BaseUnitOfMeasure");
 

На самом деле достаточно добавить коллекцию статей в класс UnitOfMeasure, и вам больше не нужно добавлять builder.Имеет один, если вы не хотите определенного поведения удаления.

Кстати, C # 9.0 вводит типы записей, которые являются ссылочным типом, который предоставляет синтезированные методы для обеспечения семантики значений для равенства. Записи по умолчанию неизменяемы. Таким образом, вам больше не нужно иметь частного установщика в вашем классе.

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

1. Спасибо за ответ. Я пробовал это, но получаю ту же ошибку. Должно быть, что-то еще не так. Я отредактировал свой пост, чтобы включить мой класс DbContext.

Ответ №2:

Проблема решена. У меня не было ключа в классе UnitOfMeasure. После добавления идентификатора все работало, как ожидалось.