Добавление унаследованного класса из другой сборки с помощью дискриминатора и последующее его получение.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Добавление унаследованного класса из другой сборки с помощью дискриминатора и последующее его получение.

Сообщение Anonymous »

Я столкнулся со следующей ситуацией: я создаю повестку дня с помощью AgendaItemModel, которая создается в сборке под названием AgendaModule. Вы можете предположить, что эта сборка используется, но есть еще одна необязательная сборка: RepeatingAgendaModule, которая содержит
класс RepeatingAgendaItemModel, наследуемый от AgendaItemModel.
Важно отметить, что AgendaModule ничего не знает о RepeatingAgendaModule (конечно, наоборот, RepeatingAgendaModule будет знать о AgendaModule, поскольку он наследуется от AgendaItemModel).
Я пытаюсь объединить AgendaItemModel и RepeatingAgendaItemModel в одну и ту же таблицу базы данных, используя для каждой из них определенный дискриминатор, поскольку они оба содержат одни и те же свойства (только выполнение для RepeatingAgendaItemModel должно происходить в RepeatingAgendaModule, следовательно, никаких дополнительных свойств).Но когда я получаю все объекты AgendaItemModel в AgendaModule, я также хочу получить объекты RepeatingAgendaItemModel, несмотря на то, что эти объекты неизвестны и затем показаны в повестка дня в клиенте (основная цель того, чего я пытаюсь достичь).
TLDR; из отдельного модуля я пытаюсь добавить унаследованный объект (с помощью дискриминатора) в таблицу его базового типа, а затем получить его.
Теперь я попытался добавить это следующим образом (но запуск миграции не приводит к производные типы, которые будут добавлены):

Код: Выделить всё

public class AgendaContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasDiscriminator("Discriminator")
.HasValue("AgendaItemModel");
AddDerivedTypes(modelBuilder);
}

private void AddDerivedTypes(ModelBuilder modelBuilder)
{
var baseType = typeof(AgendaItemModel);
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var derivedTypes = assemblies.SelectMany(assembly => assembly.GetTypes()).Where(t => t != baseType && baseType.IsAssignableFrom(t));

foreach (var type in derivedTypes)
{
var entityTypeBuilder = modelBuilder.Entity(type);
modelBuilder.Entity().HasDiscriminator("Discriminator").HasValue(type, type.Name);
}
}
}
И в повторяющемся модуле повестки дня:

Код: Выделить всё

public class RepeatingAgendaContext : AgendaContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasBaseType()
.HasDiscriminator("Discriminator")
.HasValue("RepeatingAgendaItemModel");
}
}
Когда я пытаюсь получить объекты AgendaItemModel, находящиеся в базе данных, я получаю следующее исключение:

'System.InvalidOperationException' в Microsoft.EntityFrameworkCore.Relational.dll: 'Невозможно материализовать экземпляр сущности типа 'RepeatingAgendaItemModel'. Ни один дискриминатор не соответствует значению дискриминатора «RepeatingAgendaItemModel»

Несмотря на то, что цикл, похоже, находит эти дискриминаторы в AddDerivedTypes.
Буду очень признателен за любую помощь, я уже давно застрял на этом!

Подробнее здесь: https://stackoverflow.com/questions/787 ... criminator
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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