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