簡體   English   中英

如何首先在實體框架代碼中創建 2 個相同類型的 dbset?

[英]How to create 2 dbsets with the same type in Entity Framework code first?

我創建了 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);
}

我收到這個錯誤

不支持每種類型的多個對象集。 對象集“Flights”和“FlightsArchive”都可以包含“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; }
}

所以我的問題是如何在DbContext類中創建 2 DbSet具有相同泛型類型的DbContext

您必須使用一個不用作DbSet的基類,並在將用作DbSet的類中繼承該基類。

如果您在FlightBase中使用繼承類(例如以下示例中的DbSet ,則不會生成FlightArchiveFlight表。

班級

public class FlightBase
{
    // code
}

public class Flight : FlightBase { }

public class ArchiveFlight : FlightBase { }

數據庫上下文

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

您可以擁有 2 個 dbsets 和 2 個數據庫,如下所示:

private EntityContainer Context = new EntityContainer() { };
private EntityContainer ContextArchive = new EntityContainer("ArchiveEntityContainer") { };

//add this second constructor in your Context.tt file
public <#=code.Escape(container)#>(string connectionString) : base(connectionString) { };
//to have it in your autogenerated Context.cs file
public EntityContainer(string connectionString) : base(connectionString) { };

當然,您可以使用using語句。 您必須將對象從Context中分離出來,以便將其插入ContextArchive並反過來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM