首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle和T实体框架中的乐观并发性

Oracle和T实体框架中的乐观并发性
EN

Stack Overflow用户
提问于 2013-10-16 15:07:55
回答 1查看 2.1K关注 0票数 2

我正在构建,它将在Oracle后端和后端之间使用。我很难找到正确的方法来处理一个时间戳属性,它将在任何一个数据库后端上工作。

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

代码语言:javascript
运行
复制
[Timestamp]
public byte[] Timestamp {get;set;}

然后,在流畅的映射中,它将如下所示

代码语言:javascript
运行
复制
map.Property(p => p.Timestamp).IsRowVersion();

但是,Oracle会让我将我的公共属性类型更改为:

代码语言:javascript
运行
复制
public int Timestamp {get;set;}

然后,在流畅的映射中,它将如下所示

代码语言:javascript
运行
复制
map.Property(p => p.Timestamp).HasColumnName("ORA_ROWSCN").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsConcurrencyToken();

因此,我的第一个猜测是,也许我可以将数据类型更改为long,因为时间戳是8个字节,但是SqlServer不喜欢映射。

我的下一个猜测是放弃时间戳和Ora_RowScn,并创建自己的乐观并发属性。有任何建议或知道是否有一个愉快的模型,在Sql和Oracle之间工作的方式?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 15:30:40

我就是这样解决这个问题的。我去掉了时间戳属性。然后,我还为我的存储库创建了两个程序集,一个用于Oracle,另一个用于MSSQL。我的基本模型是这样的。

代码语言:javascript
运行
复制
[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; }
        }
    }

然后在每个流畅的设置中,我就是这样处理映射的。

用于。

代码语言:javascript
运行
复制
Property(p => p.Timestamp).HasColumnType("timestamp").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).IsRowVersion();
            Ignore(p => p.Signature);

甲骨文

代码语言:javascript
运行
复制
Ignore(p => p.Timestamp);
            Property(p => p.Signature).HasColumnName("Timestamp").IsConcurrencyToken();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19407029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档