web-dev-qa-db-ja.com

EF-Code-Firstで主キー名を指定する方法

Entity Framework Codefirstを使用してデータベースを作成しています。スキーマ名がdbo.pk_Jobsのデフォルトの主キーは、ODBC経由で接続するとアクセス2007を混乱させるようです。名前を手動で編集してスキーマ名を削除し、このプライマリキーの名前をpk_jobsに変更すると、Accessはテーブルを読み取ることができるようになります。

Fluent API、データ属性、またはその他の方法を使用して、スキーマの名前を含まないように主キー名を指定できますか。

public class ReportsContext : DbContext
{
    public DbSet<Job> Jobs { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Job>().ToTable("Jobs");
        modelBuilder.Entity<Job>().HasKey(j => j.uuid);

        base.OnModelCreating(modelBuilder);
    }
}
public class Job
{
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}
28
tourdownunder

列名を指定してプロパティ名を上書きする場合は、次を試してください。

注釈を使用する

public class Job
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("CustomIdName")]
    public Guid uuid { get; set; }
    public int active { get; set; }
}

コードファーストを使用する

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        base.OnModelCreating(mb);

        mb.Entity<Job>()
            .HasKey(i => i.uuid);
        mb.Entity<Job>()
          .Property(i => i.uuid)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
          .HasColumnName("CustomIdName");
    }

内部移行構成

public partial class ChangePrimaryKey : DbMigration
{
    public override void Up()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.IndexName', 'New_IndexName', 'INDEX'");
    }

    public override void Down()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.New_IndexName', 'Old_IndexName', 'INDEX'");
    }
}
55
cubski

Key属性を使用して、主キーの部分を指定できます。だからあなたのジョブクラスは

public class Job
{
    [Key]
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}

データ注釈属性は System.ComponentModel.DataAnnotations名前空間 で定義されています

7
Chris Dunaway

私が理解していれば、Entity Frameworkが使用する主キー列の名前を変更する方法を尋ねています。 HasKeyステートメントへの次の追加でこれを処理する必要があります。

modelBuilder.Entity<Job>().Property(j => j.uuid).HasColumnName("pk_Jobs")
1
Jeff Siver

(これは、@ Jeff Siversと@cubskiによる回答/コメントを補完するものです。)

私の知る限り、データ属性でPK名を指定することはできません。名前のdbo.部分を取り除く必要がある場合があります。次に、次のように、最初に手動で編集したコードを使用して名前を変更します。

public partial class ChangeNameOnPKInCustomers : DbMigration
{
    private static string fromName = "PK_dbo.Customers";    // Name to change

    private static string toName = fromName.Replace("dbo.", "");

    public override void Up()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{fromName}]', @newname=N'{toName}'");
        // Now the PK name is "PK_Customers".
    }

    public override void Down()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{toName}]', @newname=N'{fromName}'");
        // Back to "PK_dbo.Customers".
    }
}
1
savehansson

Code Firstを使用して明示的な移行を追加すると、移行の名前が.csファイルになります。これは、ベースクラスDbMigrationを持つ部分クラスです。

主キー制約には、何をしようとしているかに応じて、DropPrimaryKeyまたはAddPrimaryKey関数があります。私の問題はDropPrimaryKeyにありました。Dbには主キーの名前が異なっていたからです。

これらの関数は両方ともPKの名前を取得するためのオーバーロードを持っているため、PKの名前を明示的に指定できます。明示的なPK名を使用したDropPrimaryKeyでうまく機能しました。引数はオブジェクトanonymousArgumentsであり、デフォルトではnullです。