17

コードを最初に使用するときに、Entity Framework によって生成される外部キー制約の名前を変更する機会があるかどうか疑問に思います。

2 つのエンティティがUserありGroup、多対多の関係があるため、関連付けテーブルがありますGroupUser。残念ながら、自動生成された外部キー制約の名前はFK_dbo.GroupUser_dbo.User_User_UserIdandFK_dbo.GroupUser_dbo.Group_Group_GroupIdです。

FK_GroupUser_UserIdと呼ばれる外部キー制約が必要FK_GroupUser_GroupIdです。それは私にはずっときれいに見えます。

4

2 に答える 2

10

データ注釈またはDbModelBuilderFluent API を使用して外部キー制約名をカスタマイズすることはできません。ただし、コードベースの移行で名前を制御できます。

  • 最初のオプション: 移行によってテーブルが作成される場合:

    結合テーブル用に自動的に生成される移行コードは次のようになります。

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

    ここでは、2 つのForeignKeyメソッド呼び出しを変更して、 を呼び出す前にカスタム制約名を設定できますupdate-database

            .ForeignKey("User", t => t.UserId, cascadeDelete: true,
                name: "FK_GroupUser_UserId")
            .ForeignKey("Group", t => t.GroupId, cascadeDelete: true,
                name: "FK_GroupUser_GroupId")
    
  • 2 番目のオプション: テーブルが既に存在する場合は、制約を削除して、名前を変更した新しいものを移行に追加できます。

    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")
    
            // ...
        }
    }
    
于 2013-07-29T17:00:14.077 に答える
3

SqlServerMigrationSqlGeneratorから派生したカスタム SQL ジェネレーター クラスを実装できます。System.Data.Entity.SqlServer

詳細については、回答を参照してください

于 2015-07-22T21:02:47.893 に答える