我有一个包含以下对象的实体模型:
我有以下关系: House< 1> ----< >任务(一对多) 任务< > ----< 1> TaskType(多对一)
现在,我想在House和TaskType之间添加多对多关系,以设置可用于房屋的任务类型。
在Visual Studio 2010中执行此操作的正确方法是什么,而不会丢失数据库中的数据。
如果我在一个没有生成任何数据库的全新模型上执行此操作,它可以正常工作,但如果我在第一次生成数据库后尝试添加它,我会松开所有数据,因为生成的SQL会丢弃所有表格。
如果我尝试在名为HouseTaskTypes的数据库中手动创建一个表,其中包含两列(House_Id和TaskType_Id)以及House和TaskTypes的外键,当我从数据库更新模型时,它看起来很奇怪。
我可能会让它与一些手动调整一起工作,但我想知道在现有的Entity Framework模型中添加多对多关联/关系的正确方法是什么。
所有想法都表示赞赏!
答案 0 :(得分:1)
EF 4.1不支持将现有数据库架构迁移到新架构。来自msdn:
Code First不支持迁移 现有数据库架构的该 实体框架4.1确实支持 删除并重新创建数据库 模型更改时的模式 使用数据库初始化器。该 支持以下初始值设定项: CreateDatabaseIfNotExist, DropCreateDatabase总是和 DropCreateDatabaseIfModelChanges
所以,为了解决你的问题,我会
手动映射关系将以下方法添加到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");
});
}
}
您必须仔细检查属性名称/密钥名称,但这应该这样做。