代码之家  ›  专栏  ›  技术社区  ›  michasaucer

如何保持或正确转换对象类型?

  •  -1
  • michasaucer  · 技术社区  · 7 年前

    我正在处理这个问题。

    我有基础课 Worker 这是抽象的。它的基类用于 Driver 和 AmountBonus Bonus 是基于 Decorator design pattern . 我的装饰师装饰了我的一处房产 工人

    它在代码中的外观:

    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”。”

    驾驶员 对象类型?我需要它来编辑数据库中完全相同的行。我的 dbo.Workers 一栏有一栏 Discriminator 由实体框架核心制作,我需要有如下价值观 驾驶员 , Farmer 等等,我在这个例子中没有提到。

    我可以为我的客户创建一个实体 正如我所说,我需要在我的数据库中有origin对象类型。我需要使用 Decorator Type ?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Chris Pratt    7 年前

    你这样做毫无意义。装饰类是实用类;它们将编程功能覆盖到它们装饰的类上。它们不是不能也不应该持久化到数据库之类的东西。

    Driver ,那么你需要把它保留一段时间 驾驶员 ,而不是用 AmountBonus 然后尝试持久化 那个 . 稍后,如果您需要任何功能 金额奖金 decorator再次补充道,您只需将 驾驶员

    看起来你对装饰师做的事情都没什么意思,但是如果仅仅是包装一个 驾驶员 驾驶员 实例以实际保存 而不是你的装饰师。

        2
  •  1
  •   Fabio    7 年前


    对提供的实例进行任何更改。
    然后,您将能够将修改后的实例保存到数据库中。

    [HttpPut("Amount/{id}")]
    public Worker Get(int id)
    {
        var worker = _context.Workers.Find(id);
    
        switch (worker)
        {
            case Driver d:
                var amountBonus = new AmountBonus(worker) { Id = id };
                amountBonus.ExecuteDecoration();
    
                _context.Entry(worker).State = EntityState.Modified;
                _context.SaveChanges();
                break;
        }
    
        return Ok(worker);
    }
    

    AmountBonus 类甚至不需要从中继承 Worker . 你的铸造问题会自行解决
    那么对我来说,它看起来更像访客模式;)

    推荐文章