2013-07-29 12 views
13

Zastanawiam się, czy istnieje jakakolwiek szansa na zmianę nazwy klucza obcego ograniczenie wygenerowane przez Entity Framework przy pierwszym użyciu kodu.Najpierw kod EF - niestandardowa nazwa ograniczenia klucza obcego

Mam dwie jednostki - User i Group - z relacją wiele do wielu, więc istnieje tabela skojarzeń GroupUser. Niestety, automatycznie generowane ograniczenia klucza obcego są nazywane FK_dbo.GroupUser_dbo.User_User_UserId i FK_dbo.GroupUser_dbo.Group_Group_GroupId.

Chciałbym mieć ograniczenia klucza obcego nazwane jak FK_GroupUser_UserId i FK_GroupUser_GroupId. Wydaje mi się to dużo czystsze.

+0

Spróbuj [how-to-dostosować-zagranicznego-key-colum n ...] [1] [1]: http://stackoverflow.com/questions/5700645/how-to-customize-foreign-key-column-name-using-entity-framework- najpierw kod – Nilesh

+0

To tylko jak ustawić niestandardową nazwę kolumny, a nie nazwę klucza obcego. Jest mnóstwo pytań i odpowiedzi dotyczących dostosowywania nazwy kolumny klucza obcego, ale nie znalazłem żadnego na personalizowaniu nazwy zagranicznej. – MrHenkey

Odpowiedz

6

Nie można dostosować nazwy ograniczenia klucza obcego za pomocą adnotacji danych lub interfejsu API Fluent API DbModelBuilder. Można jednak kontrolować nazwę za pomocą migracji opartych na kodzie.

  • Pierwsza opcja: Kiedy tabele uzyskać utworzone poprzez migracje:

    Kod migracji, który jest automatycznie generowany dla tabeli łączącej będzie wyglądać następująco:

    public partial class MyMigration : DbMigration 
    { 
        public override void Up() 
        { 
         CreateTable("GroupUser", 
          c => new 
          { 
           UserId = c.Int(nullable: false), 
           GroupId = c.Int(nullable: false), 
          }) 
         .PrimaryKey(t => new { t.UserId, t.GroupId }) 
         .ForeignKey("User", t => t.UserId, cascadeDelete: true) 
         .ForeignKey("Group", t => t.GroupId, cascadeDelete: true) 
         .Index(t => t.UserId) 
         .Index(t => t.GroupId); 
    
         // ... 
        } 
    } 
    

    Tutaj można modyfikować dwa wywołania metody, aby ustawić niestandardową nazwę ograniczenia przed wywołaniem update-database:

     .ForeignKey("User", t => t.UserId, cascadeDelete: true, 
          name: "FK_GroupUser_UserId") 
         .ForeignKey("Group", t => t.GroupId, cascadeDelete: true, 
          name: "FK_GroupUser_GroupId") 
    
  • Druga opcja: Kiedy tabele istnieją już można upuścić ograniczenie i dodać nową nazwę zmieniono jeden w migracji:

    public partial class MyMigration : DbMigration 
    { 
        public override void Up() 
        { 
         DropForeignKey("UserGroup", "UserId", "User"); 
         DropForeignKey("UserGroup", "GroupId", "Group"); 
    
         AddForeignKey("UserGroup", "UserId", "User", 
          name: "FK_GroupUser_UserId"); 
         AddForeignKey("UserGroup", "GroupId", "Group", 
          name: "FK_GroupUser_GroupId") 
    
         // ... 
        } 
    } 
    
+1

Jak upuścić klucz obcy, jeśli ma już niestandardową nazwę, ponieważ wygenerowany skrypt używa nazw pól i dlatego nie jest pomijany, ponieważ nie wprowadza instrukcji if –

2

można wdrożyć niestandardowe sql klasę generatora pochodzący z SqlServerMigrationSqlGenerator z System.Data.Entity.SqlServer

więcej datail Plesewo zobaczyć answer

Powiązane problemy