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

时间:2011-05-18 14:46:26

标签: c# entity-framework sql-server-2008

我有一个包含以下对象的实体模型:

  • 任务
  • 任务类型

我有以下关系: House< 1> ----< >任务(一对多) 任务< > ----< 1> TaskType(多对一)

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

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

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

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

我可能会让它与一些手动调整一起工作,但我想知道在现有的Entity Framework模型中添加多对多关联/关系的正确方法是什么。

所有想法都表示赞赏!

1 个答案:

答案 0 :(得分:1)

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

  

Code First不支持迁移   现有数据库架构的该   实体框架4.1确实支持   删除并重新创建数据库   模型更改时的模式   使用数据库初始化器。该   支持以下初始值设定项:   CreateDatabaseIfNotExist,   DropCreateDatabase总是和   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");
                });

    }
}

您必须仔细检查属性名称/密钥名称,但这应该这样做。