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

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

Сообщение Anonymous »

Я столкнулся со следующей ситуацией: я создаю повестку дня с помощью AgendaItemModel, которая создается в сборке под названием AgendaModule . Вы можете предположить, что эта сборка используется, но есть еще одна необязательная сборка: RepeatingAgendaModule, которая содержит
класс RepeatingAgendaItemModel, наследуемый от AgendaItemModel .
Важно отметить, что AgendaModule ничего не знает о RepeatingAgendaModule (наоборот, RepeatingAgendaModule будет знать о AgendaModule, поскольку RepeatingAgendaItemModel наследует от AgendaItemModel).
Я пытаюсь объединить AgendaItemModel и RepeatingAgendaItemModel в одной и той же таблице базы данных, используя для каждого из них отдельный дискриминатор, поскольку они оба содержат одни и те же свойства (в повторяющемся модуле должно происходить только выполнение для RepeatingAgendaItemModule, следовательно, никаких дополнительных свойств).
Но когда я получаю все объекты 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' in Microsoft.EntityFrameworkCore.Relational.dll: 'Unable to materialize entity instance of type 'RepeatingAgendaItemModel'. No discriminators matched the discriminator value 'RepeatingAgendaItemModel'.'
Несмотря на то, что цикл, похоже, находит эти дискриминаторы в AddDerivedTypes.
Буду очень признателен за любую помощь, я' я застрял на долгое время!

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

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

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

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

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

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

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