如何使用数据库迁移和EF 4.3与代码第一种方法来创建关系表?

时间:2012-06-14 15:09:47

标签: c# asp.net-mvc-4 database-migration entity-framework-4.3

我一直在尝试使用Scott Gu在Tech Days中使用的MVC 4.0和数据库迁移,并且遇到了存在多对多关系时创建的数据库的问题。 / p>

http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2364从21:14开始

包括用于生成数据库的代码片段,如下图所示。

public class Trip    {
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime Begin { get; set; }
    public DateTime End { get; set; }
    public Location HomeCountry { get; set; }
    //public IList<Location> Itinerary { get; set; }

    public ICollection<Location> Itinerary { get; set; }

    public Trip()
    {
        this.Itinerary = new HashSet<Location>();
    }
}


public class Location
{
    public int ID { get; set; }
    public string Name { get; set; }

    public ICollection<Trip> Trips { get; set; }

    public Location()
    {
        this.Trips = new HashSet<Trip>();
    }

}

这是结果数据库。 (我会发布一张图片,但我无法发布图片,仍然是新用户)

Tables
  Locations
    PK ID      (int)
       Name    (varchar)
       Trip_ID (int)
  Trips
    PK ID             (int)
       Name           (varchar)
       Begin          (datetime)
       End            (datetime)
       HomeCountry_ID (int)

我想我会期望为Locations和Trips之间的多对多关系创建第三个关系表(许多Locations可以应用于许多Trips),而不是将Trip_Id列添加到Locations表。有谁知道我在这里做错了什么?有没有办法让数据库自动化正确创建这些表?

提前感谢您的所有帮助!

更新的 我找到了以下链接,但我仍然无法使用EF 4.3使其工作。我还编辑了我的代码片段以反映以下帖子。

http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First

1 个答案:

答案 0 :(得分:1)

我终于能够使用我添加到我更新的问题中的链接正确创建表格,但仍未在解决方案上真正销售。我的Db Context类添加了方法[protected override void OnModelCreating(DbModelBuilder modelBuilder)]。

public class MyTesterContext : DbContext
{
    public MyTesterContext () : base("name=MyTesterContext ")
    {
    }

    public DbSet<Trip> Trips { get; set; }
    public DbSet<Location> Locations { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Trip>().
          HasMany(t => t.Itinerary).
          WithMany(l => l.Trips).
          Map(
           m =>
           {
               m.MapLeftKey("TripID");
               m.MapRightKey("LocationID");
               m.ToTable("TripLocations");
           });
    }

}

新数据库现在如下所示:

Tables
  Locations
    PK ID      (int)
       Name    (varchar)
  TripLocations
       TripID     (int)
       LocationID (int)
  Trips
    PK ID             (int)
       Name           (varchar)
       Begin          (datetime)
       End            (datetime)
       HomeCountry_ID (int)

在代码项目讨论中它说:
http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First

  

因此,现有关系表存在一个小问题。我们可以通过重写OnModelCreating方法并使用Code First Fluent API添加映射来解决问题。

由于我没有现有的关系表,老实说我不认为这个步骤是必需的,但我一直无法找到任何其他方法来创建正确的表结构。希望随着我对该技术越来越熟悉,我可以找到一种方法来要求覆盖OnModelCreating方法。