zoukankan      html  css  js  c++  java
  • EntityFramework 二

    特性
    用来具体的设置数据库属性
     
    [Table("表名")]//设置表名
    public class User
    {
        [Key] //设置主键
        [Column("列名")] //设置列名
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        //None 不自增
        //Identity 自增
        //Computed 数据库计算生成
        public int Id{get;set;}
        
        [StringLength(10)] //varchar长度
        
        public int Name{get;set;}
        
        [Required] //必要的(非空)
        [Column(TypeName="varchar")] //类型设置
        
        public int LoginName{get;set;}
        
        public int Password{get;set;}
    
        [foreignKey("stu")] //设置外键
        public int sid{get;set;}
        public student stu{get;set;}
    
        Nullable<int> age{get;set;} //让int 类型可以赋空值
        //缩写为 int? age
        
        [NotMapped] //不在数据库生成
        public string SumMoney{get;set;}
    }

    EF生成数据库设置

    public SQLContext():base("conStr")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<SQLContext>());//生成数据库设置
        Database.SetInitializer<SQLContext>(null);
        //DropCreateDatabaseAlways<SQLContext> 执行一次删除重建一次数据库
        //DropCreateDatabaseIfModelChanges<SQLContext> 当数据库模型发生变化时才删除重建数据库
        //null 不会自动删除重建数据库
    }
    long 类型 长度
    922 0000 0000 0000 0000
     
    输出EF所做的操作
    context.Database.Log = (msg) =>
    {
        Console.WriteLine(msg); 
    }

    联表

    EF做联表操作时,使用Include

    foreach(var item in context.stu.Include("表名")) 
    {
        
    }
    //或者
    foreach(var item in context.stu.Include(m=>m.User)) //lambda
    {
    
    }
    
    //只拿出指定的列
    foreach(var item in context.stu.Include(m=>m.User).Select(m=>new {m.title,m.user,...}))
    {
    }

    EF中在属性中加上virtual,它就会变成懒加载,在使用时才会加载

    直接用sql语句操作数据库,即使在上下文中没有的表也可以操作

    context.Database.ExecuteSqlCommand("sql语句");

    直接用sql语句操作数据库,并把结果封装到一个模型类中

    context.Database.SqlQuery<封装的类>("sql语句");

    EF不是所有lambda写法都能被支持,出错的时候,把那条语句单独提取出来用变量接收一下就行了

    EF 对象的状态
    Detached(游离态),Unchanged(未修改),Added(新增),Deleted(删除),modified(被修改)
     
    游离态 → 保存到数据库 → 未修改
    游离态 → 添加(集合) → 新增(Add) → 保存到数据库 (SavaChange)→ 未修改
    未修改 → 修改属性→ 被修改 → 保存到数据库(SavaChange) → 未修改
    未修改 → 删除(集合) → 删除 → 游离态
     
    强制修改对象的状态可以省掉一些状态的转换,提高性能
    如:查询出的数据为未修改,通过remove变为删除状态,保存后就会删除这条数据
            但如果直接把数据从未修改 改为 删除状态,则不需要remove,直接保存即可删掉这条数据
    Context.Entry(对象).State = EntityState.xxxx;//强制修改对象状态

    保存时不进行验证

    Context.Configuration.ValidateOnSaveEnabled = false;

    加上AsNoTracking() 可以让查询出来的对象直接变成游离态

    Context.stu.AsNoTracking().Where(XXX);

    关闭级联删除检测

    protected override void OnModelCreating(DbModelBuilder modelBuider)
    {
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    }

    当不确定是什么对象时使用set (例如使用泛型时)

    Context.set<T> //set中给什么对象,他就会相当于什么对象使用
  • 相关阅读:
    Python——读取大文件(GB)
    Flask——实现上传功能
    Python-模块XlsxWriter将数据写入excel
    Python-利用xlrd模块操作excel
    并发环境下,先操作数据库还是先操作缓存?
    深入浅出了解CDN
    Python——格式化GMT时间
    Python——数据库like模糊查询
    全面了解HTTP和HTTPS
    Http-请求过程
  • 原文地址:https://www.cnblogs.com/nicopoiduang/p/8886291.html
Copyright © 2011-2022 走看看