移行

通常、ODP.NET EF Coreでは、.NETのデータ型とその特性に基づいて適切なデータベース・データ型がマップされます。この表は、デフォルト・マッピングを示しています。Fluent API/注釈を使用して、.NETタイプを有効なOracleデータ型にマップできます。

この表は、デフォルト・マッピングを示しています。Fluent APIおよびデータ注釈を使用して、.NETタイプを有効なOracleデータ型にマップできます。

表5-1 ODP.NET Entity Framework Core移行データ型のデフォルト・マッピング

.NETタイプの別名 .NETデータ型 必要なFluent API * Oracle Databaseデータ型

bool

System.Boolean

なし

NUMBER(1)

sbyte

System.Sbyte

なし

NUMBER(3)

byte

System.Byte

なし

NUMBER(3)

short/int16

System.Int16

なし

NUMBER(5)

ushort/uint16

System.UInt16

なし

NUMBER(5)

int/int32

System.Int32

なし

NUMBER(10)

uint32

System.UInt32

なし

NUMBER(10)

decimal

System.Decimal

なし

NUMBER(18,2)

long/int64

System.Int64

なし

NUMBER(19)

uint64

System.UInt64

なし

NUMBER(20)

float

System.Float

なし

BINARY_FLOAT

double

System.Double

なし

BINARY_DOUBLE

DateTime

System.DateTime

なし

TIMESTAMP(7)

DateTimeOffset

System.DateTimeOffset

なし

TIMESTAMP(7)WITH TIME ZONE

TimeSpan

System.Timespan

なし

INTERVALDAY(8)TOSECOND(7)

char

System.Char

なし

NVARCHAR2(1)

byte[]

System.Byte[]

なし

RAW(2000)

byte[]

System.Byte[]

HasMaxLength(x <= 2000)

RAW(x)

byte[]

System.Byte[]

HasMaxLength(x > 2000)

BLOB

string

System.String

なし

NVARCHAR2(2000)

string

System.String

IsUnicode(false) &&

IsFixedLength(false) &&

HasMaxLength(x > 4000)

CLOB

string

System.String

IsUnicode(true) &&

IsFixedLength(false) &&

HasMaxLength(x > 2000)

NCLOB

string

System.String

IsUnicode(false) &&

IsFixedLength(false) &&

HasMaxLength(x <= 4000)

VARCHAR2(size)

string

System.String

IsUnicode(true) &&

IsFixedLength(false) &&

HasMaxLength(x <= 2000)

NVARCHAR2(size)

string

System.String

IsUnicode(false) &&

IsFixedLength(true) &&

HasMaxLength(x < 2000)

CHAR(size)

string

System.String

IsUnicode(true) &&

IsFixedLength(true) &&

HasMaxLength(x < 1000)

NCHAR(size)

guid

System.Guid

なし

RAW(16)

* 指定したFluent APIのかわりに、対応するデータ注釈を使用することもできます

NCHARおよびNVARCHAR2では、文字長セマンティクスが使用されます。これらのデータ型のいずれかを使用する列の文字数は、文字セットNLS_NCHAR_CHARACTERSETによって決まります。ODP.NET Entity Framework Coreは2バイトの文字セットにデフォルト設定されるため、NCHAR列およびNVARCHAR2列では最大2000文字が使用できます。文字列エンティティ・プロパティに[Maxlength(4000)]データ注釈またはFluent APIが使用される場合、指定された長さが2000文字を超えるため、ODP.NETではプロパティをNCLOB型にマップします。

たとえば、データベースNLS_NCHAR_CHARACTERSETNVARCHAR2(4000)列がある場合、またはNVARCHAR2列の最大長が32 KB (つまり、MAX_STRING_SIZE = EXTENDED)の場合、文字列エンティティ・プロパティでは、デフォルトのNCLOBにマップするのではなく、[Column]データ注釈またはFluent APIを使用してN文字データ型にマップできます。次に、このような注釈の使用例を示します。

[Column("Name", TypeName = "NVARCHAR2(4000)")]
string EmployeeName

アプリケーションでは、NCLOBよりN文字データ型が優先されます。これは、データをフェッチして更新するのに追加のサーバー・ラウンドトリップが不要なためです。

Synonyms

EF Core移行では、RelationalDatabaseFacadeExtensionsクラスを使用して任意のOracleスキーマ・オブジェクトを生成できます(ExecuteSqlRawメソッドを使用してそれらのオブジェクトに対してDDLを実行するなど)。たとえば、サンプル表Blogsのシノニムを作成するには、次のコード・スニペットを使用できます。

    private static void SetupDatabase()
    {
      using (var db = new BloggingContext())
      {
        db.Database.EnsureDeleted();
        if (db.Database.EnsureCreated())
        {

      //other code

          #region Synonym
          db.Database.ExecuteSqlRaw(
              " create synonym s for \"Blogs\";");
         #endregion

          db.SaveChanges();
        }
      }
    }