jeudi 10 janvier 2019

How to keep or properly cast object Type?

Im dealing with this problem.

I have base class Worker that is abstract. Its base class for Driver and AmountBonus. That Bonus is writed based on Decorator design pattern. My decorator decorate one of property from Worker.

How it looks in code:

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
}

Im making WebApi app. I operate in data by endpoints. That is my PUT request:

    // 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;
    }

It is obviious, that i get:

System.InvalidCastException: 'Unable to cast object of type '....Models.Bonus.AmountBonus' to type '...Models.Driver'.'

But my question is, is it any posibilities to vast that Driver object type? I needed it to edit exact same row in my database. My dbo.Workers column have column Discriminator made by Entity Framework Core and i need to have values like Driver, Farmer etc that i made and didnt mentioned in this example.

I Could make an Entity for my AmountBonus that i said, i need to have origin object type in my database. And i need to use Decorator there. Any ideas, how i can do it? Is it possible, to keep origin Type?

Aucun commentaire:

Enregistrer un commentaire