更新具有多对多关系的实体框架 4 模型,如何
本文关键字:框架 模型 实体 如何 关系 更新 | 更新日期: 2023-09-27 17:57:06
我有一个包含以下对象的实体模型:
- 房子
- 任务
- 任务类型
我有以下关系:房屋 <1>----<<em>> 任务(一对多)任务 <</em>>----<1> 任务类型(多对一)
现在,我想在房子和任务类型之间添加多对多关系,以设置哪些任务类型可用于房子。
在Visual Studio 2010中执行此操作而不会丢失数据库中数据的正确方法是什么?
如果我在一个尚未生成任何数据库的全新模型上执行此操作,它可以正常工作,但是如果我在第一次生成数据库后尝试添加它,我将丢失所有数据,因为生成的 SQL 会删除所有表。
如果我尝试在数据库中手动创建一个名为 HouseTaskType 的表,其中包含两列(House_Id 和 TaskType_Id),外键指向 House 和 TaskTypes,当我从数据库更新模型时,它看起来很奇怪。
我可能可以通过一些手动调整来让它工作,但我想知道在现有的实体框架模型中添加多对多关联/关系的正确方法是什么。
所有的想法都值得赞赏!
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");
});
}
}
您必须仔细检查属性名称/键名称,但这应该可以做到。