Entity FrameWork DBFirst模式(2)之数据的查询(1)

在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语句。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我为您解答关于entityframework core多线程安全添加数据的问题。 首先,为了保证多线程添加数据的安全性,我们需要采用下列方法之一: 1. 使用隔离级别为Serializable的数据库事务,这种隔离级别会锁定所有涉及的资源,直到事务完成,可以避免多个线程之间同时访问同一资源的问题。 2. 使用线程同步机制,比如使用lock关键字保护代码块,避免多个线程同时访问同一资源的问题。 在 Code First 设计模式中,我们可以使用 DbSet<TEntity> 类来代表一个实体集,从而方便地对实体对象进行各种操作。 在多线程环境下,我们应该创建不同的 DbContext 实例,并且别忘了使用 using 语句来自动释放资源。下面是一个使用 Code First 设计模式添加实体的多线程示例: ``` csharp public async Task AddEntityAsync<TEntity>(TEntity entity) where TEntity : class { using (var db = new MyDbContext()) { try { await db.Database.BeginTransactionAsync(IsolationLevel.Serializable); await db.Set<TEntity>().AddAsync(entity); await db.SaveChangesAsync(); await db.Database.CommitTransactionAsync(); } catch(Exception e) { await db.Database.RollbackTransactionAsync(); throw e; } } } ``` 在上面的代码中,我们使用了 IsolationLevel.Serializable 隔离级别来保证事务的粒度,同时使用 try..catch..finally 语句来保证事务的完整性,即事务在出现异常时回滚。 希望以上答案可以帮助您解决问题,谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值