zoukankan      html  css  js  c++  java
  • EF_简单的增删改查

    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]
    )

  • 相关阅读:
    mdadm
    RAID磁盘阵列学习笔记
    内存究竟有多快?
    fping
    Intel® RAID Software User’s Guide
    为什么寄存器比内存快?
    OC-Category
    OC-id、构造方法
    OC- @property @synthesize
    OC-点语法
  • 原文地址:https://www.cnblogs.com/muzililong/p/10707682.html
Copyright © 2011-2022 走看看