私は、レガシー データベースを、主に Entity Framework Code-First を通じてアクセスして "管理" する必要がある新しいデータベースに移行しています (矛盾しているように聞こえるかもしれません)。
MS SQL Server 2014 を使用しています。
従来のデータベースには、計算列を含むいくつかのテーブルが含まれていました。典型的な GUID と DateTime のもの。
技術的に言えば、これらの列には計算列の仕様がありませんでしたが、デフォルト値
NEWID()
とGETDATE()
DbContext
次のように、これらのプロパティを処理するように構成するのは非常に簡単です。
modelBuilder.Entity<Foo>()
.Property(t => t.Guid)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder.Entity<Bar>()
.Property(t => t.DTS)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
上記は、エンティティ フレームワークに対して、 および の間にそのようなプロパティに指定された値を送信することを無視するように指示しINSERTs
ますUPDATEs
。
しかし今、レガシー レコードのインポートを許可し、 PRIMARY KEYを含むOLD 値を維持する必要があります。
IDENTITY
これは、これらのレコードを挿入する際
Id
にGuid
およびDTS
プロパティをに設定する必要があることを意味します。DatabaseGeneratedOption.None
の場合、
Id
何らかの方法SET IDENTITY_INSERT ... ON/OFF
で接続セッション内で実行する必要があります。そして、このインポート プロセスも Code-First を介して実行したいと考えています。
モデルを「一時的に」変更して
DatabaseGeneratedOption.None
、データベースの作成後にこれらのプロパティを設定すると、典型的な結果が得られます。データベースが作成されてから、コンテキストをサポートするモデルが変更されました。Code First Migrations を使用してデータベースを更新することを検討してください。
この最新バージョンのコンテキストを「確立」するために、空のコード化された移行を生成できることは理解して
-IgnoreChanges
いますが、これは、単に空の移行を前後に実行する必要があるため、受け入れられる戦略ではありません。この目的。
半分の答え:
これらのプロパティに null 許容型を与えることを検討しました。
public class Foo
{
...
public Guid? Guid { get; set; }
}
public class Bar
{
...
public DateTime? DTS { get; set; }
}
initial のデフォルト値に注意しながらDbMigration
:
CreateTable(
"dbo.Foos",
c => new
{
Id = c.Int(nullable: false, identity: true),
Guid = c.Guid(nullable: false, defaultValueSql: "NEWID()"),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Bars",
c => new
{
Id = c.Int(nullable: false, identity: true),
DTS = c.Guid(nullable: false, defaultValueSql: "GETDATE()"),
})
.PrimaryKey(t => t.Id);
質問:
しかし、疑問が残ります。実行時DatabaseGeneratedOption.Identity
にDatabaseGeneratedOption.Computed
とを切り替える方法はありますか?DatabaseGeneratedOption.None
少なくとも、DatabaseGeneratedOption.Identity
実行時にオン/オフを切り替えるにはどうすればよいでしょうか?