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中给什么对象,他就会相当于什么对象使用

 

posted @ 2018-04-19 21:13  生命不息bug不止  阅读(210)  评论(0编辑  收藏  举报