2011-05-18 112 views
1

我有以下对象实体模型:更新具有多对多关系的实体框架4模型,如何?

  • 任务
  • 任务类型

我有以下关系: 家< 1> ---- < >任务(一对多) 任务<> ---- < 1>任务类型(多对一)

现在,我想在House和TaskType之间添加多对多的关系,以设置哪些TaskType可用于房屋。

什么是正确的方式在Visual Studio 2010中执行此操作,而不会丢失数据库中的数据。

如果我在没有生成任何数据库的全新模型上执行此操作,它可以正常工作,但如果在第一次生成数据库后尝试添加它,我将全部松开我的数据,因为生成SQL会删除所有表。

如果我尝试在名为HouseTaskTypes的数据库中手动创建一个包含两列(House_Id和TaskType_Id)的表,并将外键指向House和TaskTypes,那么当我从数据库更新模型时,它看起来很奇怪。

我大概可以通过一些手动调整来实现它,但我想知道在现有的实体框架模型中添加多对多关联/关系的正确方法。

所有的想法都赞赏!

回答

1

EF 4.1不支持将现有数据库模式迁移到新数据库模式。来自msdn

Code First不支持现有数据库模式的迁移 。 实体框架4.1确实支持 删除并重新创建数据库 架构当模型更改通过 使用数据库初始值设定项时。该 以下初始化的支持: CreateDatabaseIfNotExist, DropCreateDatabaseAlways和 DropCreateDatabaseIfModelChanges

所以,解决你的问题,我会

  • 设置初始化程序,以CreateDatabaseIfNotExist,或将其关闭
  • 手动表添加到数据库
  • 的导航属性手动添加到您的模型
  • 手动映射许多一对多关系(见下文)
  • 则任何数据添加到新的表或者通过应用程式或手动

要手动映射关系添加下面的方法来你的DbContext

class protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Configurations.Add(new HouseConfiguration()); ` 
} 

然后,在相同或访问,命名空间你的DbContext类,添加配置类的许多一对多关系的一侧。这个类的目的是做实际的映射。我通常为这些配置类有一个单独的名称空间。

class HouseConfiguration : EntityTypeConfiguration<House> 
{ 
    public HouseConfiguration() 
    { 
     // many-to-many w/tasktypes 
     this.HasMany(h => h.TaskTypes) 
      .WithMany(tt => tt.Houses) 
      .Map(m => 
       { 
        m.ToTable("HouseTaskTypes"); 
        m.MapLeftKey("HouseId"); 
        m.MapRightKey("TaskTypeId"); 
       }); 

    } 
} 

您将不得不仔细检查属性名称/键名称,但这应该这样做。

+0

这就是我一直在尝试做的事情。我首先在两个栏目中添加了一个“中间”表格,其中一个用于House_id,另一个用于TaskType_id。这是在SQL Server(2008 R2 Express)中完成的。 然后,我尝试在Visual Studio中的实体模型设计器的“House”实体和“TaskType”实体之间添加多对多关联。问题是我收到错误“没有为以下的实体集/关联集指定映射”。 由于该表没有出现在“模型浏览器 - >存储 - >表/视图”部分,我无法映射到它。 – Sverker84 2011-05-20 08:25:16

+0

@ Sverker84编辑我的答案 – 2011-05-20 20:09:14