5

私はEF4.3.1CodeFirstで開発しています。以下に示すような空港テーブルがあります。

 public class Airport
    {
        [Key]
        public int ID { get; set; }
        public string Name{ get; set; }
    }

必要なのは、次のような同じ空港テーブルからの2つのFKを含むルートテーブルです。

 public class Route
    {
        public int DepartureAirportID { get; set; }
        public int DestinationAirportID { get; set; }
        public virtual Airport DestinationAirport { get; set; }
        public virtual Airport DepartureAirport { get; set; }
    }

これはどのように達成できますか?

4

2 に答える 2

4

これはあなたが必要なことをするはずです...

public class Airport
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Route> DepartureRoutes { get; set; }
    public virtual ICollection<Route> DestinationRoutes { get; set; }
}
public class Route
{
    public int DepartureAirportID { get; set; }
    public int DestinationAirportID { get; set; }
    public Airport DestinationAirport { get; set; }
    public Airport DepartureAirport { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Route>()
        .HasKey(i => new { i.DepartureAirportID, i.DestinationAirportID});

    modelBuilder.Entity<Route>()
        .HasRequired(i => i.DepartureAirport)
        .WithMany(u => u.DepartureRoutes)
        .HasForeignKey(i => i.DepartureAirportID)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Route>()
        .HasRequired(i => i.DestinationAirport)
        .WithMany(u => u.DestinationRoutes)
        .HasForeignKey(i => i.DestinationAirportID)
        .WillCascadeOnDelete(false);
}

...これにより、次のようなテーブルが作成されます...

CREATE TABLE [Airports] (
    [ID] [int] NOT NULL IDENTITY,
    [Name] [nvarchar](4000),
    CONSTRAINT [PK_Airports] PRIMARY KEY ([ID])
)
CREATE TABLE [Routes] (
    [DepartureAirportID] [int] NOT NULL,
    [DestinationAirportID] [int] NOT NULL,
    CONSTRAINT [PK_Routes] PRIMARY KEY ([DepartureAirportID], [DestinationAirportID])
)
CREATE INDEX [IX_DestinationAirportID] ON [Routes]([DestinationAirportID])
CREATE INDEX [IX_DepartureAirportID] ON [Routes]([DepartureAirportID])
ALTER TABLE [Routes] ADD CONSTRAINT [FK_Routes_Airports_DestinationAirportID] FOREIGN KEY ([DestinationAirportID]) REFERENCES [Airports] ([ID])
ALTER TABLE [Routes] ADD CONSTRAINT [FK_Routes_Airports_DepartureAirportID] FOREIGN KEY ([DepartureAirportID]) REFERENCES [Airports] ([ID])

...そしてあなたはそれをそのように使うことができます...

using (var db = new MyDbContext())
{
    foreach (var routeid in Enumerable.Range(1, 100))
    {
        var departure = new Airport { Name = "departure" + routeid };
        db.Airports.Add(departure);
        var destination = new Airport { Name = "destination" + routeid };
        db.Airports.Add(destination);

        var route = new Route{ DepartureAirport = departure, DestinationAirport = destination };
        db.Routes.Add(route);
    }

    int recordsAffected = db.SaveChanges();

    foreach (var route in db.Routes)
    {
        Console.WriteLine("{0}, {1}, {2}, {3}", route.DepartureAirportID, route.DestinationAirportID, route.DepartureAirport.Name, route.DestinationAirport.Name);
    }
}

...お役に立てれば。注:必須のプロパティには使用しないでくださいvirtual(これらはインデックスであるため、このタイプのマッピングはそのようにしか機能しないため、エラーが発生すると思います)。
また、私は常に反対の関係を追加しますが、WithMany()を空白で使用することもできますが、これも機能するはずです。

于 2012-04-06T20:39:49.280 に答える
0

クラスの空港に自己関連のプロパティを追加する必要があります。

public class Airport
{
    public int ID { get; set; }
    public string Name{ get; set; }
    public virtual ICollection<Airport> AirportRoutes { get; set; }
}

そして、OnModelCreatingメソッドを次のFluentAPIコードでオーバーライドします。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Airport>().HasMany(x => x.AirportRoutes).WithMany().Map(
            x => 
               {
                   x.MapLeftKey("DepartureId");       // left key name
                   x.MapRightKey("DestinationId");    // right key name
                   x.ToTable("Routes");               // table name
               });
}

これがお役に立てば幸いです。

于 2012-04-18T08:25:44.493 に答える