Определение многих ко многим с именами внешних ключей таблицы соединения без конкретной таблицы домена С# (теневое соедиC#

Место общения программистов C#
Ответить
Anonymous
 Определение многих ко многим с именами внешних ключей таблицы соединения без конкретной таблицы домена С# (теневое соеди

Сообщение Anonymous »

Я пытаюсь связать отношения «многие ко многим» без какого-либо промежуточного класса в моем домене.
Ссылка — 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 sealed class 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 sealed class SoundProfile : EnumEntity
{
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»