2013-10-16 28 views
1

我正在構建EF代碼第一個將在Oracle後端和MS SQL Server後端之間使用的POCO。我遇到了一個問題,找到正確的方法來解決在任一數據庫後端工作的Timestamp屬性。Oracle與T-SQL之間的實體框架中的樂觀併發性

MS SQL服務器要我用這樣一個共同的屬性:

[Timestamp] 
public byte[] Timestamp {get;set;} 

然後在流利的映射它看起來像這樣

map.Property(p => p.Timestamp).IsRowVersion(); 

但是甲骨文將不得不改變我的共同屬性類型爲:

public int Timestamp {get;set;} 

然後在流暢的映射它看起來像這

map.Property(p => p.Timestamp).HasColumnName("ORA_ROWSCN").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsConcurrencyToken(); 

所以我的第一個猜測是,也許我可以在數據類型更改爲長,因爲時間戳是八個字節,但SqlServer的不喜歡的映射。

我的下一個猜測是放棄Timestamp和Ora_RowScn並組成我自己的樂觀併發屬性。任何建議或知道是否有一種方法可以在Sql和Oracle之間使用快樂模型?謝謝。

回答

1

這就是我解決問題的方法。我擺脫了[時間戳]屬性。然後,我還爲我的存儲庫創建了兩個程序集,一個用於Oracle,另一個用於MSSQL。然後我的基本模型看起來像這樣。

[DataContract] 
    public abstract class DomainBase 
    { 
     /// <summary> 
     /// Gets or sets the id. 
     /// </summary> 
     [DataMember] 
     [Key] 
     public long Id { get; set; } 


     private byte[] _timestamp=new Guid().ToByteArray(); 

     /// <summary> 
     /// Gets or sets the timestamp. 
     /// </summary> 
     [DataMember] 
     public byte[] Timestamp { get { return _timestamp; } 
      set { _timestamp = value; 
      if (_timestamp != null && _signature != Convert.ToBase64String(_timestamp)) 
        _signature = Convert.ToBase64String(_timestamp); 
      } 
     } 

     private string _signature = Convert.ToBase64String(new Guid().ToByteArray()); 

     /// <summary> 
     /// Gets the signature. 
     /// </summary> 
     [DataMember] 
     public string Signature 
     { 
      get { return _signature ?? (Timestamp != null ? _signature = Convert.ToBase64String(Timestamp) : null); } 
      protected set { _signature = value; 
       if ((_timestamp == null && !String.IsNullOrWhiteSpace(_signature)) || 
        (_timestamp != null && !String.IsNullOrWhiteSpace(_signature) && Convert.ToBase64String(_timestamp) != _signature)) 
        _timestamp = Convert.FromBase64String(value); 
      } 
     } 

     /// <summary> 
     /// Gets a value indicating whether has signature. 
     /// </summary> 
     public bool HasSignature 
     { 
      get { return Timestamp != null; } 
     } 
    } 

然後這就是我如何處理每個流利設置中的映射。

對於MSSQL服務器。

Property(p => p.Timestamp).HasColumnType("timestamp").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsRowVersion(); 
      Ignore(p => p.Signature); 

對於Oracle

Ignore(p => p.Timestamp); 
      Property(p => p.Signature).HasColumnName("Timestamp").IsConcurrencyToken();