c# - 如何首先在 Entity Framework 代码中创建 2 个相同类型的 dbsets?

标签 c# entity-framework

我创建了 2 个代表数据库实体的类。

第一个实体:

public enum FlightStatus
{
        checkIn,
        gateClosed,
        arrived,
        departedAt,
        unknown,
        canceled,
        expectedAt,
        delayed,
        InFlight
}

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<Passanger> PassengerList { get; set; }
        public double PriceForFirstClass { get; set; }
        public double PriceForBusiness { get; set; }
        public double PriceForEconom { get; set; }
}

第二个实体:

public enum Sex
{
        M,
        F
}

public enum FlightClass
{
        First,
        Business,
        Econom,
}

public enum TicketType
{
        OneWay,
        TwoWay,
}

public class Passenger
{
        [Key]
        public string Passport { get; set; }
        public string flightNumber { get; set; }

        [ForeignKey("flightNumber")]
        public virtual Flight flight { get; set; }      

        public string FirstName { get; set; }
        public string SecondName { get; set; }
        public string Nationality { get; set; }       
        public DateTime DateOfbirthday { get; set; }
        public Sex SexOfPassanger { get; set; }
        public FlightClass ClassForPassanger { get; set; }
        public TicketType TypeOfTicket { get; set; }
}

然后我创建了一个DbContext:

class FlightsDatabase : DbContext
{
    public DbSet<Flight> Flights { get; set; }
    public DbSet<Flight> FlightsArchive { get; set; }

    public DbSet<Passenger> Passengers { get; set; }
}

当我尝试使用这段代码时:

using (FlightsDatabase flights = new FlightsDatabase())
{
    foreach (Flight flight in flights.Flights)
    {
        if (Math.Abs((flight.Departure - DateTime.Now).Days) <= 1)
        {
            timeCame(flight, null);
        }

        if (flight.Departure < DateTime.Now)
        {
            flightsToClean.Add(flight);
        }
    }

    moveOldFlights(flightsToClean, null);
}

我收到这个错误

Multiple object sets per type are not supported. The object sets 'Flights' and 'FlightsArchive' can both contain instances of type 'Project_Airline_Info.Models.Flight'.

所以我的问题是如何在 DbContext 类中创建 2 个具有相同泛型类型的 DBset。

最佳答案

简短的回答是你不能这样做。考虑这行代码:

var flight = context.Set<Flight>().Where(f => f.FlightNumber == "123");

它如何知道使用哪个集合来获取数据?

可能最简单的解决方法是继承 Flight 类并将其用于您的其他 DbSet:

public class ArchiveFlight : Flight
{
}

和你的上下文:

public class FlightsDatabase :DbContext
{
    public DbSet<Flight> Flights { get; set; }
    public DbSet<ArchiveFlight> FlightsArchive { get; set; }
    public DbSet<Passanger> Passengers { get; set; }
}

这样做的好处是,您现在可以向存档的航类添加属性,例如存档日期:

public class ArchiveFlight : Flight
{
    public DateTime DateArchived { get; set; }
}

关于c# - 如何首先在 Entity Framework 代码中创建 2 个相同类型的 dbsets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640279/

相关文章:

c# - 我可以像在 asp.net mvc 中那样在 Webforms 项目中创建 html 助手吗?

c# - 悖论 : Why is yield return faster than list here

c# - 获取 Enum[] 的 int 值

c# - RichTextBox 改变字母颜色 - 速度问题

c# - 我需要使用和分配锁吗?

c# - 自定义数据提供者?

c# - 在 Entity Framework 中设置数据库超时

c# - 找不到程序集 'Microsoft.SqlServer.Types' 版本 10 或更高版本

c# - .Include() 与 .Load() 在 EntityFramework 中的表现

c# - 尝试将泛型与 Entity Framework 一起使用