Ссылка — SoundProfiles Switches. Они оба не требуются. Я получаю сообщение об ошибке: Произошла одна или несколько ошибок. (Навигация 'SwitchSoundProfiles (Dictionary).SoundProfileId' не найдена. Добавьте навигацию к типу объекта перед его настройкой.).
Я хочу по возможности избегать использования промежуточного класса, раньше он работал (и сверялся с документацией), но почему-то я, должно быть, делаю что-то неправильно, или, возможно, это просто невозможно. Я включил файлы, на которые есть ссылки, ниже.
EntityTypeConfiguration содержит следующее:
builder.HasMany(s => s.SoundProfiles)
.WithMany(sp => sp.Switches)
.UsingEntity(
"SwitchSoundProfiles",
j => j
.HasOne()
.WithMany()
.HasForeignKey("SoundProfileId")
.OnDelete(DeleteBehavior.Cascade),
j => j
.HasOne()
.WithMany()
.HasForeignKey("SwitchId")
.OnDelete(DeleteBehavior.Cascade),
j =>
{
j.ToTable("SwitchSoundProfiles");
j.HasKey("SwitchId", "SoundProfileId");
j.Navigation("SoundProfileId").IsRequired(false);
j.Navigation("SwitchId").IsRequired(false);
});
Для справки я включу оба класса:
- Switch (где идентификатор свойства унаследован от базового класса Entity)
{
public string Name { get; init; } = string.Empty;
public string Manufacturer { get; init; } = string.Empty;
public FeelMechanism FeelMechanism { get; init; } = FeelMechanism.Unknown;
public ICollection SoundProfiles { get; init; } = new List();
public Technology Technology { get; init; } = Technology.Unknown;
public int? PinCount { get; init; }
private Switch() { }
///
/// Creates a new Switch instance with optional classification references.
/// Null classification IDs map to their respective Unknown variants.
///
public static Switch New(
string name,
string manufacturer,
FeelMechanism? feelMechanism,
ICollection? soundProfiles,
Technology? technology,
int? pinCount = null)
{
if (soundProfiles == null || soundProfiles.Count == 0)
{
soundProfiles = new List { SoundProfile.Unknown };
}
return new Switch
{
Name = name.Trim(),
Manufacturer = manufacturer.Trim(),
FeelMechanism = feelMechanism ?? FeelMechanism.Unknown,
SoundProfiles = soundProfiles,
Technology = technology ?? Technology.Unknown,
PinCount = pinCount
};
}
}
- SoundProfile.cs (где идентификатор унаследован от EnumEntity, который наследуется от Entity)
{
public static readonly SoundProfile Unknown = New(Constants.Unknown);
public ICollection Switches { get; private set; } = [];
private SoundProfile() { }
public static SoundProfile New(string name)
=> string.IsNullOrWhiteSpace(name)
? Unknown
: new() { Name = name.Trim() };
}
Другие конфигурации EnityTypeConfigurations, базовая для EnumEntity
public abstract class EnumEntityTypeConfiguration : IEntityTypeConfiguration
where TEnum : EnumEntity
{
protected readonly string _tableName;
protected readonly int _nameMaxLength;
protected EnumEntityTypeConfiguration(
string tableName,
int nameMaxLength = 200)
{
_tableName = tableName;
_nameMaxLength = nameMaxLength;
}
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable(_tableName);
builder.HasKey(e => e.Id);
builder.Property(e => e.Id)
.ValueGeneratedOnAdd();
builder.Property(e => e.Name)
.IsRequired()
.HasMaxLength(_nameMaxLength);
builder.HasIndex(e => e.Name)
.IsUnique();
ConfigureEnum(builder);
}
///
/// Allows derived configurations to add additional mapping logic.
///
protected virtual void ConfigureEnum(EntityTypeBuilder builder)
{
}
}
И реализация SoundProfile.cs, а также Technology.cs
public sealed class SoundProfileConfiguration
: EnumEntityTypeConfiguration
{
public SoundProfileConfiguration()
: base("SwitchSoundProfiles") { }
}
public sealed class TechnologyConfiguration
: EnumEntityTypeConfiguration
{
public TechnologyConfiguration()
: base("SwitchTechnologies") { }
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... te-c-sharp
Мобильная версия