基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)

上一篇里面整理了一下需求和思路,自定义了扩展的字典对象,这里我们再继续深入编码。

BaseExtensions类,这个类作未来任何需要Key-Value形式扩展的基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/// <summary>
   /// 扩展设置的操作基类,该类不能实例化,该抽象对象主要提供配置的转化和读取操作
   /// </summary>
   public abstract class BaseExtensions
   {
       /// <summary>
       /// 创建对象修改后事件
       /// </summary>
       public event ItemChanged OnItemChanged;
       /// <summary>
       /// 建立对象设置字典的虚方法。在派生类中可以重写改方法
       /// </summary>
       public virtual SettingDictionary Items { getset; }
       public BaseExtensions()
       {
       }
       /// <summary>
       /// 返回指定值得的Json字符串表现形式
       /// </summary>
       /// <param name="value"></param>
       /// <returns></returns>
       public virtual string ToJson(object value)
       {
           string result = JsonConvert.SerializeObject(value);
           return result;
       }
       /// <summary>
       /// 指定对象转换为json字符串
       /// </summary>
       /// <typeparam name="T">要转换的对象</typeparam>
       /// <param name="value">对象值</param>
       /// <returns>返回转换的json字符串</returns>
       public virtual string ToJson<T>(T value)
       {
           string result = JsonConvert.SerializeObject(value);
           return result;
       }
       /// <summary>
       /// 为指定的键设置值的实例
       /// </summary>
       /// <param name="key">关键字</param>
       /// <param name="value">对应的值</param>
       public virtual void SetItem(string key, object value)
       {
           string v = this.ToJson(value);
           if (this.Items.ContainsKey(key.ToLower()))
               this.Items[key.ToLower()] = v;
           else
               this.Items.Add(key.ToLower(), v);
           if (OnItemChanged != null)
               OnItemChanged(this, key);
       }
       /// <summary>
       /// 为指定的键设置对象类的值
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="key"></param>
       /// <param name="value"></param>
       public virtual void SetItem<T>(string key, T value)
       {
           string v = this.ToJson(value);
           if (this.Items.ContainsKey(key.ToLower()))
               this.Items[key.ToLower()] = v;
           else
               this.Items.Add(key.ToLower(), v);
           if (OnItemChanged != null)
               OnItemChanged(this, key);
       }
       /// <summary>
       /// 为指定的键设置字符串类型的值
       /// </summary>
       /// <param name="key"></param>
       /// <param name="value"></param>
       public virtual void SetItem(string key, string value)
       {
           if (this.Items.ContainsKey(key.ToLower()))
               this.Items[key.ToLower()] = value;
           else
               this.Items.Add(key.ToLower(), value);
           if (OnItemChanged != null)
               OnItemChanged(this, key);
       }
       /// <summary>
       /// 从字典对象缓存读取键值,将指定key的设置以泛型方式获取对象的实例
       /// </summary>
       /// <typeparam name="T">对象类型</typeparam>
       /// <param name="key">配置的键</param>
       /// <returns>返回配置对象的实例</returns>
       public virtual T GetItem<T>(string key)
       {
           T result=default(T);
           string res = this.Items[key.ToLower()];
           if (!String.IsNullOrEmpty(res))
               result = JsonConvert.DeserializeObject<T>(res);
           return result;
       }
       /// <summary>
       /// 根据关键字获取值
       /// </summary>
       /// <param name="key"></param>
       /// <returns></returns>
       public virtual string GetItem(string key)
       {
           string result = this.Items[key.ToLower()];
           return result;
       }
   }

 

MiniSiteDataExtensionsEntities数据库实体类,这里的例子是SQLite,EF6生成的代码这里不做重复,这里MiniSiteDataExtensionsEntities的代码是以 public partial class MiniSiteDataExtensionsEntities的方式存在,是用来扩展EF的实体类MiniSiteDataExtensionsEntities(命名方式我系统内的使用)这个东东主要是操作数据库,这里不累述,通过是partial来扩展,只是做一件事,由于我们的数据库用的SQLite,可以在实例化过程中通过自定义连接选择不同的数据库问文件,只要数据库里有上篇里面的表即可。我们这里做法是把表放在一个固定的数据库模版里面,在需要使用的时候,根据模版数据库文件,复制到指定的地方作为自己的扩展数据库用。在我们的这个例子里是根据一个sitekey的变量来创建不同的数据库文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public partial class MiniSiteDataExtensionsEntities
    {
        /// <summary>
        /// 根据站点sitekey获取站点扩展信息数据库实例
        /// </summary>
        /// <param name="sitekey"></param>
        /// <returns></returns>
        public static MiniSiteDataExtensionsEntities GetContext(string sitekey)
        {
            if(String.IsNullOrEmpty(sitekey))
                throw new WeixinException("必选参数sitekey为空");
            SiteMsg site = SiteMsg.GetSiteMsg(sitekey);
            return MiniSiteDataExtensionsEntities.GetContext(site.SiteUnid);
        }
        /// <summary>
        /// 根据站点的id获取站点的扩展信息数据库实例
        /// </summary>
        /// <param name="siteUnid"></param>
        /// <returns></returns>
        public static MiniSiteDataExtensionsEntities GetContext(Guid siteUnid)
        {
            string efConStr = "metadata=~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.csdl|~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.ssdl|~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.msl;provider=System.Data.SQLite.EF6;provider connection string=\"Data Source={0};BinaryGUID=False\"";
            if (Guid.Empty.Equals(siteUnid))
                throw new WeixinException("没有传入正确的siteUnid");
            string appPath = System.AppDomain.CurrentDomain.BaseDirectory;
            string data_template = appPath + "X\\minisite_extensions_template.db";
            if (HttpContext.Current != null)
            {
                data_template = HttpContext.Current.Server.MapPath("~/app_data/X/minisite_extensions_template.db");
            }
            string siteDir = SiteMsg.GetSiteDataDirectory(siteUnid);
            string site_data = Path.Combine(siteDir, "minisite_extensions.db");
            if (!Directory.Exists(siteDir))
                Directory.CreateDirectory(siteDir);
            if (!File.Exists(site_data))
                File.Copy(data_template, site_data);
            return new MiniSiteDataExtensionsEntities(String.Format(efConStr, site_data));
        }
        public MiniSiteDataExtensionsEntities(string connStr):base(connStr)
        {
        }
    }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4196 [CQOI2006]凸多边形 /【模板】半平面交

P4196 [CQOI2006]凸多边形 /【模板】半平面交 本来是个板子题&#xff0c;而且我这个板子之前在POJ写过一些题目了&#xff0c;但是这里一直让我RE。 后来解决办法竟然是&#xff1a;先读入第一个多边形不加边&#xff08;存下来&#xff09;&#xff0c;然后去读其他多边形&a…

自然数幂之和

自然数幂之和 https://blog.csdn.net/suncongbo/article/details/97622131 这个文章的整理非常全面。

kettle 空字符串 null问题解决

今天&#xff0c;在配置kettle同步mysql数据的时候&#xff0c;碰到了kettle把空字符串当成null的情况。 解决步骤&#xff1a; 找到配置文件&#xff1a;C:\Users\用户名.kettle目录中找到kettle.properties添加配置&#xff1a;KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY重启k…

从你的全世界路过—一群程序员的稻城亚丁游记

转眼之间又即将到九月&#xff0c;又到了这个适合去川西旅游的最佳季节。最近有一些朋友问我稻城亚丁的旅游情况&#xff0c;因此我将去年写的这一篇游记再次发出来&#xff0c;希望对那些有计划去川西旅游的朋友们有帮助&#xff01;温馨提示&#xff1a;本文图片较多&#xf…

Beauty Contest(凸包 + 旋转卡壳(模板))

Beauty Contest 直接跑一个凸包&#xff0c;然后跑一跑旋转卡壳&#xff0c;求最大值就行了。 /*Author : lifehappy */ #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <iostre…

P2303 [SDOI2012] Longge(数论/欧拉函数)

P2303 [SDOI2012] Longge 一道看似非常基础的数论题&#xff0c;但是蕴含了非常多的知识&#xff0c;求解 ∑i1ngcd(i,n)\sum_{i1}^ngcd(i,n) i1∑n​gcd(i,n) 这个东西我们轻松地就能化简成id∗φid*\varphiid∗φ的形式&#xff0c;然后考虑如何快速求解&#xff0c;那么可以…

2019-03-06-算法-进化(三数之和)

题目描述 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 例如, 给定数组 nums […

2019-03-06-算法-进化(最接近的三数之和)

题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 …

P3345 [ZJOI2015]幻想乡战略游戏

P3345 [ZJOI2015]幻想乡战略游戏 带修改带权重心 这是经典的树上寻找关键点的题目&#xff0c;我们使用点分治处理这个问题&#xff0c;因为点分治的特性&#xff0c;就相当于在树上二分了。但是这与倍增不同&#xff0c;倍增只是在链上二分&#xff0c;而点分治则是在整棵树上…

莫比乌斯,欧拉函数题目练习(完结)

Starttime&#xff1a;2020/11/16Start\ time&#xff1a;2020/11/16Start time&#xff1a;2020/11/16 Lastupdatetime:2020/11/28Last\ update\ time: 2020/11/28Last update time:2020/11/28 AC22/22AC\ 22 / 22AC 22/22 解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)

前面两边的代码就是一套初步的工具包架构&#xff0c;基本底层通用&#xff0c;可以移植到任意项目实现类似的需求。接下来&#xff0c;再在我们特定的项目几微助手里面再实现一套基于自己项目的基类&#xff0c;根据项目需求抽象一下项目内的常用方法。理论上&#xff0c;这一…

2019-03-09-算法-进化(从排序数组中删除重复项)

题目描述 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1 给定数组 nums…

P6329 【模板】点分树 | 震波

P6329 【模板】点分树 | 震波 这是一道模板题&#xff0c;需要支持两个操作&#xff0c;操作一就是单点修改点权&#xff0c;操作二就是查询距离x不超过k的点权值和。 我们考虑建出点分树&#xff0c;然后对于每个点维护两个数据结构&#xff0c;一个处理当前分治范围到当前点…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(1)

在项目中&#xff0c;经常会需要对一些特定的业务对象进行属性的扩展&#xff0c;而且这些属性的扩展还具备极不可预测性、相互关系松散等特点。大部分的开发人员是最讨厌这类涉及到数据字段扩展的需求变更。这种调整&#xff0c;轻则数据要加字段&#xff0c;重则程序代码要做…

2019-03-09-算法-进化(买卖股票的最佳时机 II)

题目描述 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买…

【C】Natasha V1.3.6.0 的升级日志

文章转载授权级别&#xff1a;C 预计阅读时间&#xff1a;8分钟开源库满足于个人&#xff0c;而完善于大众。Natasha 自稳定版发布之后&#xff0c;众多老铁参与增强改进&#xff0c;感谢如下老铁的反馈&#xff1a;1. 异常搜集在 wenjq0911 建议下&#xff0c;添加…

牛客练习赛69 解方程

解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣ndkidk∗If∗idp∗Iidq∗I∑d∣nμ(d)μ∗I对上面式子同时卷上一个μf∗idpidq因为idk是一个完全积性函数&#xff0c;所以idp−1μidpidk∗(μidp)∑d∣ndkμ(nd)(nd)k∑d∣nμ(d)ϵfidq∗(μidp)f(n)∑d∣nμ(d)dp(nd)qf(1…

2019-03-09-算法-进化(旋转数组)

题目描述 给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示…

.NET 程序员如何学习Vue

之所以取这个标题&#xff0c;是因为本文来自内部培训的整理&#xff0c;培训的对象是公司的 .NET 程序员&#xff0c;.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。Vue 是现在比较流行的前端框架&#xff0c;也是非常容易入门的前端框架&#xff0c;…

P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)

P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题&#xff0c;而且限制了链的长度&#xff0c;那么我们需要点分治处理&#xff0c;然后考虑每次分治&#xff0c;我们可以把链分成两类&#xff0c;先处理同色连通块&#xf…