我有一个EF Code First模型,其中包含一个Foo表和一个Bar表。这是一个多对多的关系,因此EF生成了一个名为FooBars的联结表:
CreateTable(
"dbo.FooBar",
c => new
{
Foo_Id = c.Int(nullable: false),
Bar_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Foo_Id, t.Bar_Id })
.ForeignKey("dbo.Foos", t => t.Foo_Id, cascadeDelete: true)
.ForeignKey("dbo.Bars", t => t.Bar_Id, cascadeDelete: true)
.Index(t => t.Foo_Id)
.Index(t => t.Bar_Id);
一切都很好。现在,我对模型进行了一些更改并添加了一个迁移。 Foo实体现在有一些额外的字符串和int属性,关系或任何东西都没有变化。但是,出于某种原因,EF现在坚持认为联结表应该被称为BarFoos,并且想要删除原始的FooBars表:
DropForeignKey("dbo.FooBars", "Foo_Id", "dbo.Foos");
DropForeignKey("dbo.FooBars", "Bar_Id", "dbo.Bars");
DropIndex("dbo.Foobars", new[] { "Foo_Id" });
DropIndex("dbo.FooBars", new[] { "Bar_Id" });
CreateTable(
"dbo.BarFoos",
c => new
{
Bar_Id = c.Int(nullable: false),
Foo_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Bar_Id, t.Foo_Id })
.ForeignKey("dbo.Bars", t => t.Bar_Id, cascadeDelete: true)
.ForeignKey("dbo.Foos", t => t.Foo_Id, cascadeDelete: true)
.Index(t => t.Bar_Id)
.Index(t => t.Foo_Id);
DropTable("dbo.FooBars");
显然,我可以将FooBars中的所有记录复制到BarFoos中,但这很烦人,而且当我对模型进行更改并重新生成此特定迁移时,我需要继续这样做。为什么EF坚持认为联结表应该突然相反?我可以做些什么来避免这种情况吗?
答案 0 :(得分:1)
我之前发生过这种情况 - 我从来没有找到解决方案,但我的解决方法是在Fluent API中强制使用表名。例如:
modelBuilder.Entity(Of User)() _
.HasMany(Function(u) u.Roles) _
.WithMany(Function(r) r.Users) _
.Map(Function(u) u.MapRightKey("Role_RoleID").MapLeftKey("User_UserID").ToTable("UserRoles"))
(C#,以匹配问题语言):
modelBuilder.Entity<User>()
.HasMany(u => u.Roles)
.WithMany(r => r.Users)
.Map(u => u.MapRightKey("Role_RoleID").MapLeftKey("User_UserID").ToTable("UserRoles"));