У меня есть код EF Первая модель, содержащая таблицу для Foo и таблицу для Bar. Это отношение много-много, поэтому EF создал таблицу соединений FooBars:EF Code First Migration настаивает на переключении имен таблиц переходов
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 теперь имеет некоторые дополнительные свойства string и 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 Into BarFoos, но это раздражает, как ад, и что-то, что мне нужно будет продолжать делать, когда я вношу изменения в модель и повторно генерирую эту конкретную миграцию. Почему EF настаивает на том, что стол развязки вдруг будет наоборот? Могу ли я сделать что-то, чтобы этого избежать?
У меня было это произошло раньше - я никогда не найти решение, но мой обходной путь, чтобы заставить имя таблицы в Fluent API. например, modelBuilder.Entity (Of User)() _ . HasMany (функция (u) u.Roles) _ .WithMany (Функция (r) r.Users) _ .Map (Функция (u) u.MapRightKey («User_UserID»). MapLeftKey («Role_RoleID»). ToTable («UserRoles»)) – Carl
Мне пришлось перевернуть левую и правую клавиши из примера, который вы дали, но после этого он работал: миграция больше не пытается ничего изменить об этом: modelBuilder.Entity() .HasMany (s => s.Bars) .WithMany (t => t.Foos) .Map (m => m.MapRightKey ("Bar_Id"). MapLeftKey ("Foo_Id ") .ToTable (" FooBars ")); Странно, что это происходит и раздражает то, что нам нужно обходное решение, подобное этому, но все же оно работает, и это лучше, чем редактировать сгенерированный код за все время, которое мы регенерируем. Спасибо за помощь, Карл! –
Bas
@Carl вы можете поместить свой комментарий в качестве ответа. Было бы неплохо правильно отформатировать его. Плюс я бы смог проголосовать за вас – Colin