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; }
}
列名を指定してプロパティ名を上書きする場合は、次を試してください。
注釈を使用する
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'");
}
}
Key属性を使用して、主キーの部分を指定できます。だからあなたのジョブクラスは
public class Job
{
[Key]
public Guid uuid{ get; set; }
public int active{ get; set; }
}
データ注釈属性は System.ComponentModel.DataAnnotations名前空間 で定義されています
私が理解していれば、Entity Frameworkが使用する主キー列の名前を変更する方法を尋ねています。 HasKeyステートメントへの次の追加でこれを処理する必要があります。
modelBuilder.Entity<Job>().Property(j => j.uuid).HasColumnName("pk_Jobs")
(これは、@ 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".
}
}
Code Firstを使用して明示的な移行を追加すると、移行の名前が.csファイルになります。これは、ベースクラスDbMigrationを持つ部分クラスです。
主キー制約には、何をしようとしているかに応じて、DropPrimaryKeyまたはAddPrimaryKey関数があります。私の問題はDropPrimaryKeyにありました。Dbには主キーの名前が異なっていたからです。
これらの関数は両方ともPKの名前を取得するためのオーバーロードを持っているため、PKの名前を明示的に指定できます。明示的なPK名を使用したDropPrimaryKeyでうまく機能しました。引数はオブジェクトanonymousArgumentsであり、デフォルトではnullです。