无法将基类对象转换为派生类型对象,实体框架代码优先

时间:2016-07-31 08:00:28

标签: c# entity-framework inheritance casting

我知道在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的类型为Flightflights的类型为FlightsDatabase

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

1 个答案:

答案 0 :(得分:1)

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

要实现这一点,最好的解决方案是摆脱bool实体,并在Flight模型中创建 public class Flight { ... public bool FlightArchive {get;set;} } 类型的属性。

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

所以,在你的:

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();

当您需要航班列表时:您可以:

{{1}}