gpt4 book ai didi

c# - Oracle 和 T-SQL 之间 Entity Framework 中的乐观并发

转载 作者:太空宇宙 更新时间:2023-11-03 13:33:48 25 4
gpt4 key购买 nike

我正在构建将在 Oracle 后端和 MS SQL Server 后端之间使用的 EF 代码优先 POCO。我在寻找正确的方法来处理将在任一数据库后端上工作的 Timestamp 属性时遇到问题。

MS SQL Server 会让我使用这样的公共(public)属性:

[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,因为时间戳是八个字节,但 SqlServer 不喜欢这种映射。

我的下一个猜测是放弃 Timestamp 和 Ora_RowScn 并弥补我自己的乐观并发属性。任何建议或知道是否有一种方法可以在 Sql 和 Oracle 之间建立一个快乐的模型?谢谢。

最佳答案

这就是我解决问题的方法。我去掉了 [Timestamp] 属性。然后我还为我的存储库创建了两个程序集,一个用于 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; }
}
}

这就是我在每个 Fluent 设置中处理映射的方式。

对于 MSSQL 服务器。

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();

关于c# - Oracle 和 T-SQL 之间 Entity Framework 中的乐观并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com