标签:key org 选择 代码 state highlight ade 上下文 声明
一、前言
之前给一个朋友解释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
标签:key org 选择 代码 state highlight ade 上下文 声明
原文地址:http://www.cnblogs.com/jeffrey-net/p/7629384.html