2013-07-29 46 views
13

Tôi tự hỏi nếu có bất kỳ cơ hội nào để thay đổi tên khóa ngoài ràng buộc được tạo bởi Entity Framework khi sử dụng mã đầu tiên.Mã EF trước - tên ràng buộc khóa ngoài tùy chỉnh

Tôi có hai thực thể - UserGroup - với nhiều mối quan hệ để có bảng kết hợp GroupUser. Rất tiếc, các ràng buộc khóa ngoài được tạo tự động được đặt tên là FK_dbo.GroupUser_dbo.User_User_UserIdFK_dbo.GroupUser_dbo.Group_Group_GroupId.

Tôi muốn có các ràng buộc khóa ngoài được gọi là FK_GroupUser_UserIdFK_GroupUser_GroupId. Điều đó trông sạch hơn với tôi.

+0

Hãy thử [how-to-tùy-ngoại-key-cột n ...] [1] [1]: http://stackoverflow.com/questions/5700645/how-to-customize-foreign-key-column-name-using-entity-framework- code-first – Nilesh

+0

Đó chỉ là cách đặt tên cột tùy chỉnh không phải là tên khóa ngoài. Có rất nhiều câu hỏi và câu trả lời về việc tùy biến tên cột khóa ngoài nhưng tôi không tìm thấy bất kỳ tùy chỉnh nào về việc tùy chỉnh tên nước ngoài. – MrHenkey

Trả lời

6

Không thể tùy chỉnh tên hạn chế khóa ngoài bằng chú thích dữ liệu hoặc DbModelBuilder API lưu loát. Tuy nhiên, bạn có thể kiểm soát tên bằng cách di chuyển dựa trên mã.

  • tùy chọn đầu tiên: Khi các bảng được tạo ra thông qua di cư:

    Mã di cư đó được tự động tạo ra cho bảng tham gia sẽ trông như thế này:

    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); 
    
         // ... 
        } 
    } 
    

    Ở đây bạn có thể thay đổi hai cuộc gọi phương thức ForeignKey để đặt tên ràng buộc tùy chỉnh trước khi bạn gọi update-database:

     .ForeignKey("User", t => t.UserId, cascadeDelete: true, 
          name: "FK_GroupUser_UserId") 
         .ForeignKey("Group", t => t.GroupId, cascadeDelete: true, 
          name: "FK_GroupUser_GroupId") 
    
  • tùy chọn thứ hai: Khi bảng đã tồn tại, bạn có thể thả các hạn chế và thêm một mới đổi tên một trong một di cư:

    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

Làm cách nào để thả khóa ngoài nếu nó đã có tên tùy chỉnh, vì tập lệnh được tạo sử dụng tên trường và do đó nó không bị xóa vì nó không nhập câu lệnh if –

2

Bạn có thể thực hiện một lớp phát tùy chỉnh sql có nguồn gốc từ SqlServerMigrationSqlGenerator từ System.Data.Entity.SqlServer

Đối datail hơn plese thấy answer