【问题标题】:Can't cast base class object to derived type object, Entity Framework code-first无法将基类对象转换为派生类型对象,实体框架代码优先
【发布时间】:2016-07-31 08:00:28
【问题描述】:

我知道这在 C# 中是不可能的,但我需要以某种方式做到这一点。我有两个类,一个是航班列表的基类。

public class Flight 
{
        [Key]
        public string FlightNumber { get; set; }
        public DateTime Arrival { get; set; }
        public DateTime Departure { get; set; }
        public string CityOfArrival { get; set; }
        public string CityOfDeparture { get; set; }
        public char Terminal { get; set; }

        public FlightStatus Status { get; set; }
        public int Gate { get; set; }

        public virtual ICollection<Passenger> Passengers { get; set; }

        public double PriceForFirstClass { get; set; }
        public double PriceForBusiness { get; set; }
        public double PriceForEconom { get; set; }
}

以及航班存档列表的派生类。

class ArchiveFlight :Flight
{
}

这是我的DbContext 课程。

 class FlightsDatabase : DbContext
 {
        protected override void OnModelCreating(DbModelBuilder builder)
        {
            builder.Entity<Flight>().HasMany(x => x.Passengers).
                WithOptional(x => x.Flight).HasForeignKey(x => x.flightNumber).WillCascadeOnDelete(true);
        }

        public DbSet<Flight> Flights { get; set;}
        public DbSet<ArchiveFlight> FlightsArchive { get; set; }
        public DbSet<Passenger> Passengers { get; set; }
    }
}

我需要做这样的事情。

flights.FlightsArchive.Add((ArchiveFlight)flightToclean);
flights.Flights.Remove(flightToclean);

其中flightToclean 是Flight 的类型。 flights 是 FlightsDatabase 的类型。

我可以尽快执行此操作还是需要创建新的ArchiveFlight 对象并将Flight 对象的所有属性复制到新的ArchiveFlight 对象?

【问题讨论】:

  • 错字提示:这是一个乘客 - 不是“乘客”
  • 您可以将ArchiveFlight 设为基类。或者将 CUD 操作映射到存储过程,并在 Flight 的删除过程中,将删除的航班复制到 ArchiveFlight 表中。

标签: c# entity-framework inheritance casting


【解决方案1】:

如果我理解正确,您的上下文中有 Flight 实体和 FlightArchive 实体,一旦航班完成,您希望在 FlightArchive 集合中移动该航班。

要实现这一点,最好的解决方案是去掉FlightArchive 实体,并在Flight 模型中创建bool 类型的属性。

通过这种方式,您可以将该属性设置为 true,一旦航班完成(旧)。 以后的数据操作会更容易。

所以,在你的:

  public class Flight 
    {
          ...
     public bool FlightArchive {get;set;}
    }

然后,当飞行完成后,你可以这样做:

var flight=_context.Flights.Find(flightId);
flight.FlightArchive =true;

当你需要航班清单时:你可以这样做:

var flightList=_context.Flights.Any(x=>!x.FlightArchive).ToList()

var flightArchive=_context.Flights.Any(x=>x.FlightArchive).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2022-01-14
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多