1

У меня есть код 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 настаивает на том, что стол развязки вдруг будет наоборот? Могу ли я сделать что-то, чтобы этого избежать?

+1

У меня было это произошло раньше - я никогда не найти решение, но мой обходной путь, чтобы заставить имя таблицы в 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

+0

Мне пришлось перевернуть левую и правую клавиши из примера, который вы дали, но после этого он работал: миграция больше не пытается ничего изменить об этом: modelBuilder.Entity () .HasMany (s => s.Bars) .WithMany (t => t.Foos) .Map (m => m.MapRightKey ("Bar_Id"). MapLeftKey ("Foo_Id ") .ToTable (" FooBars ")); Странно, что это происходит и раздражает то, что нам нужно обходное решение, подобное этому, но все же оно работает, и это лучше, чем редактировать сгенерированный код за все время, которое мы регенерируем. Спасибо за помощь, Карл! – Bas

+1

@Carl вы можете поместить свой комментарий в качестве ответа. Было бы неплохо правильно отформатировать его. Плюс я бы смог проголосовать за вас – Colin

ответ

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")); 
Смежные вопросы