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