Я занимаюсь этой проблемой.
У меня есть базовый класс Worker
, который является абстрактным. Его базовый класс для Driver
и AmountBonus
. Это Bonus
написано на основе шаблона оформления Decorator . Мой декоратор украсит одно из имущества от Worker
.
Как это выглядит в коде:
public abstract class Worker {}
public class Driver : Worker {}
public abstract class Bonus : Worker
{
public Bonus(Worker worker) => this.worker = worker; //constructor
//decorator on worker's property
}
public class AmountBonus : Bonus
{
public AmountBonus(Worker worker) : base(worker: worker){ } //constructor
}
Я делаю WebApi
приложение. Я оперирую данными по конечным точкам. Это моя PUT
просьба:
// PUT: api/Bonus/Amount/5
[HttpPut("Amount/{id}")]
public Worker Get(int id)
{
var worker = _context.Workers.Find(id);
switch (worker)
{
case Driver d:
worker = new AmountBonus(worker) { Id = id };
//exception here
_context.Entry((Driver)worker).State = EntityState.Modified;
_context.SaveChanges();
break;
}
return worker;
}
Это очевидно, что я получаю:
System.InvalidCastException: 'Невозможно привести объект типа' .... Models.Bonus.AmountBonus ', чтобы ввести' ... Models.Driver '.'
Но у меня вопрос, есть ли какие-то возможности для такого Driver
типа объекта? Мне нужно было редактировать точно такую же строку в моей базе данных. В моем столбце dbo.Workers
есть столбец Discriminator
, созданный Entity Framework Core, и мне нужно иметь такие значения, как Driver
, Farmer
и т. Д., Которые я создал и не упомянул в этом примере.
Я мог бы создать сущность для моего AmountBonus
, что я сказал, мне нужно иметь тип объекта источника в моей базе данных. И мне нужно использовать Decorator там. Любые идеи, как я могу это сделать? Возможно ли сохранить происхождение Type
?