Entity Freamwork Demo1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Entity Freamwork Demo1相关的知识,希望对你有一定的参考价值。

一、前言

        之前给一个朋友解释EF是什么个东东,解释了半天也没有说到点子上,这也说明了我对EF的了解也不是很好。因此,本文将会介绍我是如何使用EF框架,用的不一定很合适。

        为了方便的是使用EF框架,给大家分享一个使用EF的demo。

二、代码结构

           直接上图

            技术分享

           Sln.Data:放置了EF的一些操作类如继承了DbContext的EFDbContext

           Sln.Data.Platform:里面包含的是数据库中基础表的映射关系。

           Sln.Data.Common:里面所包含的是某一个模块表的映射关系。

           Sln.Data.Test:是一个控制台程序,代表了一个模块。

三、EF映射(Entity)

       1、先展示Entity是如何配置的:

/// <summary>
    /// 组织信息实体
    /// </summary>  
    [Table(name: "tblUaOrganize", Schema = "base")]
    public class TblUaOrganize  
    {
        /// <summary>
        /// 组织ID
        /// </summary>    
        [Key]
        [Column("Organize_strId")]
        public string OrganizeId { get; set; }

        /// <summary>
        /// 组织编号
        /// </summary>  
        [Column("Organize_strCode")]
        public string Code { get; set; }
        /// <summary>
        /// 组织名称
        /// </summary> 
        [Column("Organize_strName")]
        public string Name { get; set; }
        /// <summary>
        /// 组织描述
        /// </summary> 
        [Column("Organize_strDescription")]
        public string Description { get; set; }
        /// <summary>
        /// 上级组织Id
        /// </summary> 
        [Column("Organize_strParentId")]
        public string ParentId { get; set; }
        /// <summary>
        /// 组织管理人
        /// </summary> 
        [Column("Organize_strLeaderId")]
        public string LeaderId { get; set; }
        /// <summary>
        /// 序号
        /// </summary> 
        [Column("Organize_strIdxCode")]
        public string IdxCode { get; set; }
        /// <summary>
        /// 创建人
        /// </summary> 
        [Column("Organize_dtmCreate")]
        public DateTime? Create { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary> 
        [Column("Organize_strCreator")]
        public string Creator { get; set; }


        /// <summary>
        /// 最后修改时间
        /// </summary>
        [Column("dtmLastModify")]
        public DateTime? LastModify { get; set; }

        /// <summary>
        /// 状态
        /// </summary>
        [Column("intEditState")]
        public short? EditState { get; set; }



        [ForeignKey(name: "OrganizeId")]
        public ICollection<TblUaOrganizeExtend> Extends { get; set; } 
    }

  

这里所采用的Mapping方式是DataAnnotations,之所以采用这种方式是为了快捷的知道对应关系,如果要写Mapping文件的话,需要到两个文件中进行查找,麻烦~,说白了就是懒。

四、连接数据库(DbContext)

    public class EFDbContext : DbContext
    {
        public EFDbContext(string connectString) : base(connectString)
        {
            this.Configuration.AutoDetectChangesEnabled = true;
            //延迟加载
            //默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明
            this.Configuration.LazyLoadingEnabled = true;

            Database.SetInitializer<EFDbContext>(null); 
        }
    }

  

EF的数据库连接时通过DbContext这个类创建连接。connectString可以是连接字符串也可以是在App.config中所配置的连接字符串。看个人选择。

  <connectionStrings>
    <add name="TestDbContext" connectionString="Data Source = .;Initial Catalog = SlnDB;User Id = sa;Password =sa" providerName="System.Data.SqlClient" />
  </connectionStrings>

  

 

五、使用EF

        1、在Sln.Data.Test中我创建了一个EF上下文TestDbContext,继承自Sln.Data中的EFDbContext。

              默认连接取得的是App.config中name为TestDbContext的数据库连接字符串。

 

    public class TestDbContext : EFDbContext
    {
        public TestDbContext()
            : base("TestDbContext")
        {

        }
        public DbSet<TblUaOrganize> UaOrganizes { get; set; }

        public DbSet<TblUaOrganizeExtend> UaOrganizeExtends { get; set; }

        public DbSet<TblDictionaryGroup> DictionaryGroups { get; set; }

    }

  

           2、获取数据

                在控制台的Program类中编写如下代码,获取数据。

                代码中所使用的获取数据方式是Linq,简单易学好上手。

    class Program
    {
        static void Main(string[] args)
        {
            var result = GetOrganize();
            Console.WriteLine(JsonConvert.SerializeObject(result)); 
            Console.WriteLine("----------------------------------------");
            var result2 = GetDictionaryGroup();
            Console.WriteLine(JsonConvert.SerializeObject(result2));
            Console.ReadLine();
        }

        public static List<TblUaOrganize> GetOrganize()
        {
            using (var db=new TestDbContext())
            {
                var query =  db.UaOrganizes.Include(c => c.Extends).ToList();
                return query;
            }
        }
        public static List<TblDictionaryGroup> GetDictionaryGroup()
        {
            using (var db = new TestDbContext())
            {
                var query = (from a in db.DictionaryGroups
                             select a).ToList();
                return query;
            }
        }
    }

 

 运行结果

技术分享

六、总结

     之所以将Sln.Data分出来是为了将低耦合,可以在Sln.Data中写一些EF的扩展方法或者拉姆达表达式的扩展。其他项目再使用EF时,就不会需要写很多的东西,只需要编写自定义的TestDbContext类就OK了。

最后附上代码:Sln_Data  

 

以上是关于Entity Freamwork Demo1的主要内容,如果未能解决你的问题,请参考以下文章

An entity cannot be annotated with both @Entity and @MappedSuperclass: com.example1.demo1.Entity.Use

Spring Freamwork 开发初体验

mysql--事务demo1----

几个bat文件(关于robot freamwork安装)

mybatis---demo1--(单表增删改查)----bai

No identifier specified for entity: XXXX 错误