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中给什么对象,他就会相当于什么对象使用
  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/nicopoiduang/p/8886291.html
Copyright © 2011-2022 走看看