大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > 让ADO.NET Entity Framework 支持AC

让ADO.NET Entity Framework 支持AC(2)

关键词:数据库.NETADOEntity  阅读(1899) 赞(16)

[摘要]本文是对让ADO.NET Entity Framework 支持ACCESS数据库的讲解,与大家分享。
ObjectContext 继承于IDisposable 那么我写一个自己的 ObjectContext 这样的类 我给他起个名字叫EFToAccess 那么多 构造方法 我们就需要2个一个 是 给定的连接字符串 一个是默认从webconfig中读取的链接字符串就可以了。本人偷懒,直接读取指定的路径了。数据库的简单读写可能都依赖一个where查询,那么怎么实现自己的where查询就很关键,于是我看资料研究了2天Lambda Expression 表达式。最后还是看了 博客园的一篇 扩展LINQ to SQL:使用Lambda Expression批量删除数据才会用,现在也不是很明白,懒人就是拿来主义,不怎么消化,我现在也没多少时间消化知识,估计这样的人也不少吧。下面是我自己用的的方法,利用VS生成的代码 2个替换1个删除搞定 (ObjectContext替换“你自己的类名我的是SqlDoorEntities”,ObjectSet替换成IEnumerable,删除无用的构造函数)

public class SqlDoorEntities : EFToAccess
    {
        public SqlDoorEntities():base("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
+AppDomain.CurrentDomain.BaseDirectory + "bin\\DataDoor.mdb")
        {
        }
        #region IEnumerable 属性
        /// <summary>
        /// 没有元数据文档可用。
        /// </summary>

        public IEnumerable<CmdMsg> CmdMsg
        {
            get
            {
                if ((_CmdMsg == null))
                {
                    _CmdMsg = base.CreateObjectSet<CmdMsg>("CmdMsg");
                }
                return _CmdMsg;
            }
        }
        private IEnumerable<CmdMsg> _CmdMsg;

        /// <summary>
        /// 没有元数据文档可用。
        /// </summary>
        public IEnumerable<Door> Door
        {
            get
            {
                if ((_Door == null))
                {
                    _Door = base.CreateObjectSet<Door>("Door");
                }
                return _Door;
            }
        }
        private IEnumerable<Door> _Door;

        /// <summary>
        /// 没有元数据文档可用。
        /// </summary>
        public IEnumerable<Manager> Manager
        {
            get
            {
                if ((_Manager == null))
                {
                    _Manager = base.CreateObjectSet<Manager>("Manager");
                }
                return _Manager;
            }
        }
        private IEnumerable<Manager> _Manager;

        /// <summary>
        /// 没有元数据文档可用。
        /// </summary>
        public IEnumerable<Users> Users
        {
            get
            {
                if ((_Users == null))
                {
                    _Users = base.CreateObjectSet<Users>("Users");
                }
                return _Users;
            }
        }
        private IEnumerable<Users> _Users;

        #endregion
        #region AddTo 方法

        /// <summary>
        /// 用于向 CmdMsg EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 IEnumerable&lt;T&gt; 属性的 .Add 方法。
        /// </summary>
        public void AddToCmdMsg(CmdMsg cmdMsg)
        {
            base.AddObject("CmdMsg", cmdMsg);
        }

        /// <summary>
        /// 用于向 Door EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 IEnumerable&lt;T&gt; 属性的 .Add 方法。
        /// </summary>
        public void AddToDoor(Door door)
        {
            base.AddObject("Door", door);
        }

        /// <summary>
        /// 用于向 Manager EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 IEnumerable&lt;T&gt; 属性的 .Add 方法。
        /// </summary>
        public void AddToManager(Manager manager)
        {
            base.AddObject("Manager", manager);
        }

        /// <summary>
        /// 用于向 Users EntitySet 添加新对象的方法,已弃用。请考虑改用关联的 IEnumerable&lt;T&gt; 属性的 .Add 方法。
        /// </summary>
        public void AddToUsers(Users users)
        {
            base.AddObject("Users", users);
        }

        #endregion
    }

懒人第三步:

为了让代码和EF使用方法基本一致,所以不得不做一些工作让我写的类基本满足项目需要。首先实现一个让Lambda Expression 表达式变成字符串的函数

string GetWhereString(Expression Func)
        {
            ConditionBuilder conditionBuilder = new ConditionBuilder();
            conditionBuilder.Build(Func);
            for (int i = 0; i < conditionBuilder.Arguments.Length; i++)
            {
                object ce = conditionBuilder.Arguments[i];
                if (ce == null)
                    conditionBuilder.Arguments[i] = "null";
                else if (ce is ValueType)
                    conditionBuilder.Arguments[i] = ce.ToString();
                else if (ce is string || ce is char)
                    conditionBuilder.Arguments[i] = string.Format("'{0}'", ce.ToString());
                else if (ce is DateTime)
                    conditionBuilder.Arguments[i] = string.Format("#{0}#", ce.ToString());

            }
            return string.Format(conditionBuilder.Condition, conditionBuilder.Arguments);
        }

上面的ConditionBuilder类代码我就不贴出了。大家参考我提到的那篇文章,如果实际应用当中,有死循环的地方那么应该在该调用基类的地方加入base.XXX比如base.Visit



相关评论