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

本文关键字:框架 模型 实体 如何 关系 更新 | 更新日期: 2023-09-27 17:57:06

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

  • 房子
  • 任务
  • 任务类型

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

现在,我想在房子和任务类型之间添加多对多关系,以设置哪些任务类型可用于房子。

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

如果我

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

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

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

所有的想法都值得赞赏!

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

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

代码优先不支持迁移 现有数据库架构。这 实体框架 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");
                });
    }
}

您必须仔细检查属性名称/键名称,但这应该可以做到。