【问题标题】:Updating an entity framework 4 model with a many to many relationship, how?更新具有多对多关系的实体框架 4 模型,如何?
【发布时间】:2011-05-18 14:46:25
【问题描述】:

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

  • 房子
  • 任务
  • 任务类型

我有以下关系: 房子 ----> 任务(一对多) 任务 >---- 任务类型(多对一)

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

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

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

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

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

感谢所有想法!

【问题讨论】:

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


    【解决方案1】:

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

    Code First 不支持迁移 现有的数据库模式。这 Entity Framework 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");
                    });
    
        }
    }
    

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

    【讨论】:

    • 这就是我一直在尝试做的。我首先添加了一个包含两列的“中间”表,一列用于 House_id,另一列用于 TaskType_id。这是在 SQL Server (2008 R2 Express) 中完成的,然后我尝试在 Visual Studio 的实体模型设计器中添加“House”实体和“TaskType”实体之间的多对多关联。问题是我收到错误“没有为以下实体集/关联集指定映射”。由于该表没有出现在“模型浏览器 -> 存储 -> 表/视图”部分中,因此我无法映射到它。
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多