在EF中执行数据的操作,需要使用EDM为我们生成的content类,本例为CRMDBEntities类:
namespace EntityFrameWorkDemo
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;
public partial class CRMDBEntities : DbContext
{
public CRMDBEntities()
: base("name=CRMDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Department> Department { get; set; }
public virtual DbSet<Employee> Employee { get; set; }
public virtual DbSet<Product> Product { get; set; }
public virtual DbSet<ProductType> ProductType { get; set; }
public virtual DbSet<QuoteInfo> QuoteInfo { get; set; }
public virtual DbSet<QuoteProduct> QuoteProduct { get; set; }
public virtual DbSet<Scheduler> Scheduler { get; set; }
public virtual DbSet<UserInfo> UserInfo { get; set; }
public virtual int Query_ProductNameAndPrice(Nullable<int> productNO, ObjectParameter procudtName, ObjectParameter price)
{
var productNOParameter = productNO.HasValue ?
new ObjectParameter("productNO", productNO) :
new ObjectParameter("productNO", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("Query_ProductNameAndPrice", productNOParameter, procudtName, price);
}
public virtual int Query_ProductNameAndPrice1(Nullable<int> productNO, ObjectParameter procudtName, ObjectParameter price)
{
var productNOParameter = productNO.HasValue ?
new ObjectParameter("productNO", productNO) :
new ObjectParameter("productNO", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("Query_ProductNameAndPrice1", productNOParameter, procudtName, price);
}
}
}
这里我们发现在CRMDBEntities类中,包含一些返回值为DbSet型的属性,
那么可以通过CRMDBEntities.指定的属性名 获取数据表中的所有记录(对象<–>Table)
注意:属性名–就是EDM生成的数据表对应的对象名称
搭配LINQ和Lambda做数据查询操作
我们这里查询Product记录数据:
EDM生成的Product模型类:
namespace EntityFrameWorkDemo
{
using System;
using System.Collections.Generic;
public partial class Product
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Product()
{
this.QuoteProduct = new HashSet<QuoteProduct>();
}
public int ProductNo { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
public string ImageUrl { get; set; }
public string Description { get; set; }
public Nullable<int> TypeId { get; set; }
public virtual ProductType ProductType { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<QuoteProduct> QuoteProduct { get; set; }
}
}
代码片段分析:
public virtual ProductType ProductType { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<QuoteProduct> QuoteProduct { get; set; }
实体之间的引用,实际是一种关系的反应(1:N、N:N、1:1)
注意上述两个属性的返回值:
ProductType、ICollection<QuoteProduct>
ProductType: Product ---- 1:N
Product : QuoteProduct — 1:N
所以我们可以通过引用传递获取相关的记录数据。
单表查询:不会查询相关记录的数据,
/// <summary>
/// 查询产品信息--单表查询
/// </summary>
public static void QueryProducts()
{
using (CRMDBEntities CRMDBEntities = new CRMDBEntities())//数据库上下文对象
{
var productList = CRMDBEntities.Product.Where(p => p.ProductNo >= 1002).ToList();
var product = from p in CRMDBEntities.Product where p.ProductName == "苹果8" select p;
Console.WriteLine("ProductName:" + productList.First().ProductName + "\tPrice:" + productList.First().Price);
Console.WriteLine("ProductName:" + product.First().ProductName + "\tPrice:" + product.First().Price);
}
}
首先开启sql server profiler,监控sql的执行。
打开SSMS,工具–>sql server profiler,橡皮擦清掉tracing
下面debugger执行代码:
执行之后,profiler获取到的trace:
这就验证了在EF中使用linq to entity交互时,EF还是生成原生的sql语句。