EF分为三种code_first,model_first,dabase_first这三种模式,网上的例子有好多,但是用了之后感觉实际中都不是这么用的,此处记录写下来日后用的着了可以快速应用,记录如下:
新建项目添加EF6.2
需要四个东西:
1.表对应的model实例,此例中为: shop_test
2.EF连接数据的对象类,此例中为: EF_DATA_DBCONTEXT
3.数据操作的接口类,此例中为: IRepository
4.数据实际操作类,实现接口IRespository的类,此例中为: DataAccessObject
1.shop_test
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;using System.Runtime.Serialization;
namespace EF_TEST
{ [DataContract] [Serializable] [Table("shop_test")] public partial class shop_test {[DataMember(Name ="id")]
[Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int id { get; set; } [DataMember(Name ="shopname")] public string shopname { get; set; } [DataMember(Name ="create_time")] public DateTime create_time { get; set; } [DataMember(Name ="test_msg")] public string test_msg { get; set; } }}2.EF_DATA_DBCONTEXT
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data.Entity;
namespace EF_TEST
{//用EF进行连接时需要指定的连接数据库的
class EF_DATA_DBCONTEXT:DbContext { public EF_DATA_DBCONTEXT(string contr) : base(contr) { }protected override void OnModelCreating(DbModelBuilder modelBuilder)
{ //base.OnModelCreating(modelBuilder); }public DbSet<shop_test> shoptests { get; set; }
}
}3.IRepository
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Linq.Expressions;
using System.Data.Entity;using System.Data.Entity.Infrastructure;
namespace EF_TEST{ interface IRepository {DbContext CurrentDbContext
{ get; }DbEntityEntry<T> Attach<T>(T entity) where T : class;
T Insert<T>(T entity) where T : class;
T Insert<T>(T entity, bool isCommit) where T : class;
void InsertRange<T>(IEnumerable<T> entities) where T : class;
void InsertRange<T>(IEnumerable<T> entities, bool isCommit) where T : class;
void Update<T>(T entity) where T : class;
void Update<T>(T entity, bool isCommit) where T : class;
void UpdateRange<T>(IEnumerable<T> entities) where T : class;
void UpdateRange<T>(IEnumerable<T> entities, bool isCommit) where T : class;
void Delete<T>(T entity) where T : class;
void Delete<T>(T entity, bool isCommit) where T : class;
void DeleteRange<T>(IEnumerable<T> entities) where T : class;
void DeleteRange<T>(IEnumerable<T> entities, bool isCommit) where T : class;
T Find<T>(params object[] keyValues) where T : class;
T Find<T>(object keyValue) where T : class;
List<T> FindAll<T>(Expression<Func<T, bool>> conditions = null) where T : class;
List<T> FindAllByPage<T, S>(Expression<Func<T, bool>> conditions, Expression<Func<T, S>> orderBy, int pageSize, int pageIndex) where T : class;
int SaveChanges();
}
}4.DataAccessObject
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; using System.Data.Entity;using System.Linq.Expressions;using System.Data.Entity.Infrastructure;
using System.Data; namespace EF_TEST{ class DataAccessObject:IRepository,IDisposable {private DbContext _currentDbContext = null;
public DbContext CurrentDbContext
{ get { return this._currentDbContext; } }public DataAccessObject(DbContext dbContext)
{ this._currentDbContext = dbContext; }public DbEntityEntry<T> Attach<T>(T entity) where T : class
{ DbSet<T> dbSet = this._currentDbContext.Set<T>(); dbSet.Attach(entity); return this._currentDbContext.Entry<T>(entity); }public T Insert<T>(T entity) where T : class
{ return this.Insert<T>(entity, true); }public T Insert<T>(T entity, bool isCommit) where T : class
{ this._currentDbContext.Set<T>().Add(entity); if (isCommit) { this._currentDbContext.SaveChanges(); } return entity; }public void InsertRange<T>(IEnumerable<T> entities) where T : class
{ this.InsertRange<T>(entities, true); }public void InsertRange<T>(IEnumerable<T> entities, bool isCommit) where T : class
{ this._currentDbContext.Set<T>().AddRange(entities); if (isCommit) { this._currentDbContext.SaveChanges(); } }public void Update<T>(T entity) where T : class
{ this.Update<T>(entity, true); }public void Update<T>(T entity, bool isCommit) where T : class
{ this._currentDbContext.Set<T>().Attach(entity); //this._currentDbContext.Entry<T>(entity).set_State(16); this._currentDbContext.Entry<T>(entity).State = EntityState.Modified; if (isCommit) { this._currentDbContext.SaveChanges(); } }public void UpdateRange<T>(IEnumerable<T> entities) where T : class
{ this.UpdateRange<T>(entities, true); }public void UpdateRange<T>(IEnumerable<T> entities, bool isCommit) where T : class
{ foreach (T current in entities) { this._currentDbContext.Set<T>().Attach(current); // this._currentDbContext.Entry<T>(current).set_State(16); this._currentDbContext.Entry<T>(current).State = EntityState.Modified; } if (isCommit) { this._currentDbContext.SaveChanges(); } }public void Delete<T>(T entity) where T : class
{ this.Delete<T>(entity, true); }public void Delete<T>(T entity, bool isCommit) where T : class
{ this._currentDbContext.Set<T>().Remove(entity); if (isCommit) { this._currentDbContext.SaveChanges(); } }public void DeleteRange<T>(IEnumerable<T> entities) where T : class
{ this.DeleteRange<T>(entities, true); }public void DeleteRange<T>(IEnumerable<T> entities, bool isCommit) where T : class
{ this._currentDbContext.Set<T>().RemoveRange(entities); if (isCommit) { this._currentDbContext.SaveChanges(); } }public int SaveChanges()
{ return this._currentDbContext.SaveChanges(); }public T Find<T>(params object[] keyValues) where T : class
{ return this._currentDbContext.Set<T>().Find(keyValues); }public T Find<T>(object keyValue) where T : class
{ object[] array = new object[] { keyValue }; return this._currentDbContext.Set<T>().Find(array); }public List<T> FindAll<T>(Expression<Func<T, bool>> conditions = null) where T : class
{ List<T> result; if (conditions == null) { result = this._currentDbContext.Set<T>().ToList<T>(); } else { result = this._currentDbContext.Set<T>().Where(conditions).ToList<T>(); } return result; }public List<T> FindAllByPage<T, S>(Expression<Func<T, bool>> conditions, Expression<Func<T, S>> orderBy, int pageSize, int pageIndex) where T : class
{ IQueryable<T> source = (conditions == null) ? this._currentDbContext.Set<T>() : this._currentDbContext.Set<T>().Where(conditions); return source.OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList<T>(); }public void Dispose()
{ this._currentDbContext.Dispose(); }
}
}控制台程序:
using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data.Entity;
using System.Transactions;
namespace EF_TEST{ class Program { static void Main(string[] args) {//config中的数据库的连接字符串
string CONSTR = System.Configuration.ConfigurationManager.ConnectionStrings["CONSTR"].ConnectionString; //EF的DB连接对象 EF_DATA_DBCONTEXT db = new EF_DATA_DBCONTEXT(CONSTR); //实现的的具体方法 IRepository DB_LINK = new DataAccessObject(db); //进行的查询操作 List<shop_test> msg = DB_LINK.FindAll<shop_test>(p => p.id >= 0); Console.WriteLine("查询ID大于0的所有数据"); Console.WriteLine("共查询到的信息行数:{0}--最后一个数据的时间:{1}", msg.Count, msg.Max(u => u.create_time).ToString());//插入操作
shop_test insert_shop = new shop_test() { shopname="test", test_msg="ss", create_time =DateTime.Now };using (TransactionScope scope =new TransactionScope() )
{ DB_LINK.Insert<shop_test>(insert_shop,false);shop_test insert_second = new shop_test() { shopname=insert_shop.shopname, test_msg=insert_shop.test_msg, create_time=DateTime.Now };
DB_LINK.Insert<shop_test>(insert_second, false);
DB_LINK.SaveChanges();
scope.Complete();
}Console.WriteLine("插入的id:{0}--shopname {1}---test_msg:{2} ---create_time:{2}", insert_shop.id, insert_shop.shopname, insert_shop.test_msg, insert_shop.create_time);
//更新操作 msg = DB_LINK.FindAll<shop_test>(u => u.id > 0);Console.WriteLine("查询ID大于0的所有数据");
Console.WriteLine("共查询到的信息行数:{0}--最后一个数据的时间:{1}", msg.Count, msg.Max(u => u.create_time));//更新操作,更新最大时间为当前时间
shop_test update_shop = (from i in msg
let max_time = msg.Max(u => u.create_time) where i.create_time == max_time select i ).FirstOrDefault();update_shop.create_time = DateTime.Now;
DB_LINK.Update<shop_test>(update_shop);
Console.WriteLine("更新的id:{0}--shopname {1}---test_msg:{2} ---create_time:{2}", insert_shop.id, insert_shop.shopname, insert_shop.test_msg, insert_shop.create_time);
//删除操作;
Console.WriteLine("查询ID大于0的所有数据"); Console.WriteLine("共查询到的信息行数:{0}--最后一个数据的时间:{1}", msg.Count, msg.Max(u => u.create_time)); //删除操作 删除时间最早的数据 msg = DB_LINK.FindAll<shop_test>(u => u.id > 0);shop_test delete_shop = (from i in msg
let max_time = msg.Max(u => u.create_time) where i.create_time == max_time select i ).FirstOrDefault();DB_LINK.Delete<shop_test>(delete_shop);
Console.WriteLine("删除的id:{0}--shopname {1}---test_msg:{2} ---create_time:{2}", insert_shop.id, insert_shop.shopname, insert_shop.test_msg, insert_shop.create_time);
Console.WriteLine("查询ID大于0的所有数据"); Console.WriteLine("共查询到的信息行数:{0}--最后一个数据的时间:{1}", msg.Count, msg.Max(u=>u.create_time));Console.ReadKey();
}
}}配置文件,及其数据库的表结构:
<connectionStrings>
<!--<add name="CONSTR" connectionString="DATA SOURCE=127.0.0.1;INITIAL CATALOG=TEST;USER ID=SA;PASSWORD=123"/>--> <add name="CONSTR" connectionString="Data Source=127.0.0.1;Database=TEST;UID=sa;PWD=123;" providerName="System.Data.SqlClient"/> </connectionStrings>CREATE TABLE [dbo].[shop_test]( [id] [INT] IDENTITY(1,1) NOT NULL, [shopname] [VARCHAR](50) NULL, [create_time] [DATETIME] NULL, CONSTRAINT [PK_shop_test] PRIMARY KEY NONCLUSTERED ( [id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY])