我正在构建,它将在Oracle后端和后端之间使用。我很难找到正确的方法来处理一个时间戳属性,它将在任何一个数据库后端上工作。
MS SQL Server会让我使用这样的公共属性:
[Timestamp]
public byte[] Timestamp {get;set;}然后,在流畅的映射中,它将如下所示
map.Property(p => p.Timestamp).IsRowVersion();但是,Oracle会让我将我的公共属性类型更改为:
public int Timestamp {get;set;}然后,在流畅的映射中,它将如下所示
map.Property(p => p.Timestamp).HasColumnName("ORA_ROWSCN").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsConcurrencyToken();因此,我的第一个猜测是,也许我可以将数据类型更改为long,因为时间戳是8个字节,但是SqlServer不喜欢映射。
我的下一个猜测是放弃时间戳和Ora_RowScn,并创建自己的乐观并发属性。有任何建议或知道是否有一个愉快的模型,在Sql和Oracle之间工作的方式?谢谢。
发布于 2013-12-03 15:30:40
我就是这样解决这个问题的。我去掉了时间戳属性。然后,我还为我的存储库创建了两个程序集,一个用于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; }
}
}然后在每个流畅的设置中,我就是这样处理映射的。
用于。
Property(p => p.Timestamp).HasColumnType("timestamp").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsRowVersion();
Ignore(p => p.Signature);甲骨文
Ignore(p => p.Timestamp);
Property(p => p.Signature).HasColumnName("Timestamp").IsConcurrencyToken();https://stackoverflow.com/questions/19407029
复制相似问题