#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. После добавления идентификатора все работало, как ожидалось.