• ORM初探及遇到的一些问题(极简入门)


    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

    先说下遇到的问题:

    零、主键问题。EFCORE里面需要在重写OnModelCreating里面设置HasNokey。但是EF里面没有这个(也可能我没找到),去网上找了个解决方案,设置伪主键。具体代码里面会体现

    一、EF

    1:nuget引入:EntityFrameWork,System.Data.Sqlite

    2:DBContext:

    public class MyEFDbContext : DbContext
        {
            public MyEFDbContext() : base("SqliteTest")
            { }
            /// <summary>
            /// 使用DbConnection连接数据库
            /// </summary>
            /// <param name="con"></param>
            public MyEFDbContext(DbConnection con) : base(con, true) { }
    
            /// <summary>
            /// 利用连接字符串连接数据库
            /// </summary>
            public MyEFDbContext(string connStr) : base(connStr)
            {
    
            }
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
                modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();//禁用一对多级联删除
                modelBuilder.Entity<TaskInfoEx>().HasKey(x => new { x.TaskGuid, x.MetaType });//对于没有主键的实体可以设置伪主键
                //modelBuilder.Entity.ha
                //base.OnModelCreating(modelBuilder);
            }
            //实体类
            public DbSet<UserInfo> UserInfo { get; set; }
            public DbSet<TaskInfoEx> TaskInfoEx { get; set; }
        }

    3:使用

    //DbConnection连接数据库
                System.Data.Common.DbConnection sqliteCon = System.Data.SQLite.EF6.SQLiteProviderFactory.Instance.CreateConnection();
                sqliteCon.ConnectionString = @"Data Source=C:\Users\FanLin\Desktop\DB\Product\IngestMatchLessData.db;";
                sqliteCon.Open();
                using (EF.MyEFDbContext db = new EF.MyEFDbContext(sqliteCon))
                {
                    var u = db.UserInfo.Where(x => x.LoginName != "").FirstOrDefault();
                    var user = db.UserInfo.Where(x => x.UserCode == "rrr").FirstOrDefault();
                    if (user != null)
                    {
                        //
                        db.Set<UserInfo>().Add(new UserInfo() { UserCode = "test" });
                        //
                        db.Set<UserInfo>().Remove(user);
                        //
                        user = db.UserInfo.Where(x => x.UserCode == "test").FirstOrDefault();
                        user.Password = "asdasd";
                        //
                        db.Entry<UserInfo>(user).State = System.Data.Entity.EntityState.Modified;
                        //保存以上,这样数据库才会生效
                        db.SaveChanges();
                    }
                    Console.WriteLine(u.Password);
                }

    二、EFCore

    EFCore和EF差不多的用法。

    1:引入(注意版本一致性):

    2:DBContext

    public class TaskInfoEx
        {
            public string TaskGuid { get; set; }
            public string MetaType { get; set; }
            public string MetaValue { get; set; }
            public string MetaDesc { get; set; }
        }
        public class UserInfo
        {
            [Key]
            public int UserID { get; set; }
            public string UserCode { get; set; }
            public string Password { get; set; }
            public string LoginName { get; set; }
            public string UserName { get; set; }
            public string UserDesc { get; set; }
            public string Authority { get; set; }
    
        }
        //需要引用Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.sqlite 版本需要对应
        class MyEFDBContext : DbContext
        {
            public virtual DbSet<TaskInfoEx> TaskInfoEx { get; set; }
            public virtual DbSet<UserInfo> UserInfo { get; set; }
    
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite(@"Data Source=C:\Users\FanLin\Desktop\DB\Product\IngestMatchLessData.db");
            }
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<TaskInfoEx>(entity =>
                {
                    entity.HasNoKey();//无主键
                });
            }
        }

    3:使用(使用方法差不多)

    using (MyEFDBContext db = new MyEFDBContext())
                {
                    //
                    var user = db.UserInfo.Where(x => x.UserCode == "rrr").FirstOrDefault();
                    db.Set<UserInfo>().Add(new UserInfo() {UserCode="test" });
                    db.Set<UserInfo>().Remove(user);
                    user = db.UserInfo.Where(x => x.UserCode == "test").FirstOrDefault();
                    user.Password = "asdasd";
                    db.Entry<UserInfo>(user).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                    db.SaveChanges();
                    //db.Entry<UserInfo>(new UserInfo()).State = Microsoft.EntityFrameworkCore.EntityState.Added;
    
                    //   Console.WriteLine(user[0].LoginName);

    三、SqlSugar

    1:引入SqlSugar

    2:client。SqlSugar的client可以写成静态的方便调用

    public class SqlSugarDemo
        {
            public static SqlSugarClient client = new SqlSugarClient(new SqlSugar.ConnectionConfig
            {
                ConnectionString = @"Data Source=C:\Users\FanLin\Desktop\DB\Product\IngestMatchLessData.db;Version = 3;",
                DbType = DbType.Sqlite,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute
            });
        }

    3:使用

    //sqlsugar
                var list = SqlSugarDemo.client.Queryable<TaskInfoEx>().ToList();//查询所有
                var data = new BaseConfig() { ConfigName = "jack" };
                //SqlSugarDemo.client.Insertable(data).ExecuteCommand();
                //主键
                data.ConfigName = "jack";
                //修改的东西
                data.ConfigValue = "asdada";
                SqlSugarDemo.client.Updateable<BaseConfig>(data).ExecuteCommand();
    
                /*删除*/
                SqlSugarDemo.client.Deleteable<BaseConfig>("jack").ExecuteCommand();

    SqlSugar的使用要简单的多,当然我也只是初窥门庭,若有不对及需修改之处,贻笑大方,还望指教。

    由于平常没有怎么使用过这些框架,这也只是学习之后的一个汇总,若以后有使用的更深层次的东西,也会一并修改。

  • 相关阅读:
    sed命令
    python常用库
    python标准库
    从 Python 打包到 CLI 工具
    pip
    python包自我理解
    docker常用命令
    chattr命令
    xmss
    live2d-widget.js
  • 原文地址:https://www.cnblogs.com/fanlin92/p/15772296.html
Copyright © 2020-2023  润新知