2

主キー プロパティが別の名前の列にマップされる POCO モデルがあります。

モデルは次のようなものです。

public class Transaction
{
    public long Id { get; set; }
    //....more props
}

したがって、移行は次のようになります。

CreateTable(
    "dbo.dtlTransactions",
    c => new
        {
            Id = c.Long(nullable: false, identity: true, name: "intTransactionID"),
            //...more cols
        })
        .PrimaryKey(t => t.Id);

ただし、移行を実行すると、次のようになります。

System.Data.SqlClient.SqlException (0x80131904): 列名 'Id' がターゲット テーブルまたはビューに存在しません。

SQL の生成時に columnbuilder の name プロパティが使用されていないようです。移行の -verbose オプションを使用すると、次の sql が得られます。

CREATE TABLE [dbo].[dtlTransactions] (
[intTransactionID] [bigint] NOT NULL IDENTITY,
--...other cols
CONSTRAINT [PK_dbo.dtlTransactions] PRIMARY KEY ([Id])

何か案は?これは明らかなバグですか?

4

3 に答える 3

2

EF が生成する SQL クエリの列名を Entity Framework に伝えるには、データ注釈を使用して、移行ではなくモデルに指定する必要があります...

[Column("intTransactionID")]
public long Id { get; set; }

...または Fluent API を使用:

modelBuilder.Entity<Transaction>()
    .Property(t => t.Id)
    .HasColumnName("intTransactionID");

この方法で列名を定義した後は、移行コードでそれを定義する必要はもうありません。

使用している Migration クラスのnameパラメーターは、データベースに送信される DDL スクリプトに影響しますが、列に別の名前があることを EF モデル メタデータに通知しません。

name正直なところ、移行コードのパラメーターが適しているユースケースはわかりません。

編集

次の例で動作することをテストしました。

  • 私はあなたのクラスを使用します:

    public class Transaction
    {
        public long Id { get; set; }
    }
    
  • そして、Fluent API で列名を定義するこのコンテキスト:

    public class MyContext : DbContext
    {
        public DbSet<Transaction> Transactions { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Transaction>()
                .ToTable("dtlTransactions");
    
            modelBuilder.Entity<Transaction>()
                .Property(t => t.Id)
                .HasColumnName("intTransactionID");
        }
    }
    
  • 次に、パッケージ マネージャー コンソールでenable-migrationsandを実行します。add-migration InitialSchema

  • 次に、このDbMigrationクラスを取得します。

    public partial class InitialSchema : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.dtlTransactions",
                c => new
                  {
                      intTransactionID = c.Long(nullable: false, identity: true),
                  })
                .PrimaryKey(t => t.intTransactionID);
        }
    
        public override void Down()
        {
            DropTable("dbo.dtlTransactions");
        }
    }
    
  • 次に、パッケージ マネージャー コンソールを呼び出しupdate-database -scriptて、テーブルの次の DDL スクリプトを取得します。これは、正しい期待されるスクリプトです。

    CREATE TABLE [dbo].[dtlTransactions] (
        [intTransactionID] [bigint] NOT NULL IDENTITY,
        CONSTRAINT [PK_dbo.dtlTransactions] PRIMARY KEY ([intTransactionID])
    )
    
于 2013-08-26T18:02:59.073 に答える