2017-01-27 3 views
1

Entity Framework 6(Designer Firstアプローチ)とOracleデータベース(ver 12)とのオプティミスティック同時実行を実装しようとしています。Entity FrameworkとORACLEによる楽観的同時実行

SQL Serverには、変更を追跡するために使用できるRowVersion属性があり、Oracleで類似の属性が見つかりませんでした。

トリガーを使用してRowVersionの機能をシミュレートすることができました。バージョン管理の唯一の目的のためにトリガーを作成するのではなく、他の選択肢があるかどうか疑問です。

ありがとうございます。

+1

[SQL Server:Oracleの同等のRowVersion](http://stackoverflow.com/questions/20487657/sql-server-rowversion-equivalent-in-oracle)の可能な複製 – Fran

+0

あなたは達成しようとしていることを詳しく説明できますか? Oracleは、非常に洗練された大部分の自動同時実行メカニズムを備えています。 – BobC

答えて

2

確かに、トリガーなしで行う方法があります。トリガーなしでそれを行うことは、Entity Frameworkプロバイダーによってサポートされているすべてのデータベースで動作します。

残念ながら、Designer Firstアプローチについてはわかりませんが、Code FirstではこれはおそらくDesigner First、おそらく部分クラスを使用しています)。新しいEntity Frameworkコアでのみサポートされるため、可能であれば、Code Firstを使用することをお勧めします。

モデル:

public abstract class ConcurrencyTracker 
{ 
    [ConcurrencyCheck] 
    public long LastChange { get; set; } 

    [NotMapped] 
    public DateTime LastChangeTime 
    { 
     set 
     { 
      long timestamp = value.Ticks - new DateTime(1970, 1, 1).Ticks; 
      timestamp = timestamp/TimeSpan.TicksPerSecond; 
      LastChange = timestamp; 
     } 
    } 
} 

public class Product : ConcurrencyTracker 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

コンテキスト:オプティミスティック同時実行があるので

public override int SaveChanges() 
{ 
    var currentTime = DateTime.Now; 

    var changed = ChangeTracker.Entries<ConcurrencyTracker>().Where(c => c.State != EntityState.Unchanged); 
    if (changed != null) 
    { 
     foreach (var item in changed) 
     { 
      item.Entity.LastChangeTime = currentTime; 
     } 
    } 
    return base.SaveChanges(); 
} 

EFは、製品モデルのすべての更新でLastChange列が含まれます。

+0

コードではなく、あなたがしようとしていることを英語で説明できますか? – BobC

+1

ここでは、特別なことは、データベースに更新させる代わりにLastChange列を更新することだけです。それで全部です。試してみてください... –

+1

ConcurrencyTrackerはカスタム抽象クラスです。私はそれを作り、その名前を付けました。とにかく好きな名前に変更することができます。それで、それは利用可能です。新しいテストコンソールアプリケーションでそのコードをすべて貼り付け、それを機能させてから、既存のプロジェクトで使用してください。 –

0

タイムスタンプを作成して維持するのではなく、OracleでORA_ROWSCN疑似列を使用できます。 ROWDEPENDENCIESを有効にしてテーブルを作成する必要があります

+0

ORA_ROWSCNは、行レベルでEntity Frameworkを使用するために使用できません。 – skjagini

+0

ORA_ROWSCNは疑似列であるため、行レベルで使用できます。あなたが混乱するかもしれないのは、ブロックが変更されたときにSCN(System Change Number)が実際に更新されるということだけです。ただし、ROWDEPENDENCIESを有効にすると、行レベルの変更が追跡されます。 Entity Frameworkに関して、私はそれが何であるか分かりません;) – BobC

関連する問題