
如果只是想修改连接的计算机名(或者sql服务名),我试过下面的代码是成功的。我的步骤,先新建Model,运行成功,然后修改appconfig里的连接字符串里的计算机名,运行报错,然后在用代码手动修改回正确的计算机名,运行成功。
static void Main(string[] args){
NorthwindEntities en = new NorthwindEntities();
string constr = @"data source=\sqlexpress;
initial catalog=Northwind;integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework"";
enDatabaseConnectionConnectionString = constr;
ConsoleWriteLine(enEmployeesCount());
ConsoleReadLine();
}
1查询生命周期
在进入正题时候,我们先来了解EF Core查询的生命周期。
11LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成给数据库可识别数据形式)。
发送的查询结果(查询表示形式)会被缓存,以便每次执行查询时无需进行11中处理。
12查询结果(查询表示形式)会传递到数据库提供程序
数据库提供程序会识别出查询的哪些部分可以在数据库中求值。
查询的这些部分会转换为特定数据库的查询语言(例如,关系数据库的T-SQL)。
一个或多个查询会发送到数据库并返回结果集(返回的是数据库中的值,而不是实体实例中的)。
13对于结果集中的每一项
131如果这是跟踪查询(后续会讲到),EF会检查数据是否表示已在上下文实例的更改跟踪器中的实体中。
如果是,则会返回现有实体。
如果不是,则会创建新实体、设置更改跟踪并返回该新实体。
132如果这是非跟踪查询(后续会讲到),EF会检查数据是否表示已在此查询的结果集中的实体中。
如果是,则会返回现有实体。非跟踪查询使用弱引用跟踪已返回的实体。如果具有相同标识的上一个结果超出范围,并运行垃圾回收,则可能会获得新的实体实例。
如果不是,则会创建新实体并返回该新实体。
14执行查询时
当调用LINQ运算符时,只会生成查询的内存中表示形式。当我们使用查询结果(查询表示形式)时才会发送到数据库。导致查询发送到数据库的最常见 *** 作如下:
在for循环中循环访问结果:
var blogs = from b in _contextBlog
select new
{
bBlogId,
bUrl
};
//触发数据库查询
foreach(var blog in blogs)
{
var id = blogBlogId;
}
当我们执行完LINQ运算符的时候,从SQL Server Profiler监控里面可以看到,并没有执行的SQL语句,也就是说查询结果blogs并没有立即发送给数据库获取返回数据结果集。
而当我们调试进去for循环时候,SQL Server Profiler监控里面可以看到出现了执行SQL语句。也就是说这时候查询结果blogs才执行发送给数据库返回结果集。
使用ToList、ToArray、Single、Count等运算符
_contextBlogToList();
_contextBlogToArray();
_contextBlogCount();
_contextBlogSingle();
_contextBlogFirst();
执行这种形式运算符也会立即发送到数据库获取结果集的。具体执行过程呈现,这里大伙自行测试吧。
将查询结果数据绑定到UI
2跟踪查询与非跟踪查询
在1小节生命周期里面我们有提及过跟踪与非跟踪查询,现在我们来了解下这两种查询区别。
21跟踪查询
返回实体类型的查询是默认会被跟踪的,这表示如果这些实体实例有更改行为,会通过SaveChanges()持久化将更改的值更新到数据库中,但是如果更改的值跟实体实例的值相同,则不会持久化提交数据到数据库,这就是跟踪查询。在以下示例中,将检测到对博客链接所做的更改,并在 SaveChanges() 期间将这些更改持久化到数据库中。
//返回blog实体类型的查询是默认会被跟踪
var blog = _contextBlogSingleOrDefault(b => bBlogId == 1);
//检测对博客链接所做的更改
blogUrl = "1";
//持久化保存到数据库中
_contextSaveChanges();
实体初始链接值是1,当我们点击Save按钮保存的时候,检测到对博客链接所做的更改值还是1的时候,并不会提交更改值到数据库中的。看看下图SQL Server Profiler监控就知道,并没有监控到对应有更新的T-SQL语句,也就是说并没有执行更新 *** 作:
当我们再把链接值更改为2点击保存时候,EF Core检测到博客链接值已经从1更改为2,就会持久化保存到数据库中。
blogUrl = "2";
废话少说,直接上图:
22非跟踪查询
如果不需要更新从数据库中检索到的实体,则应使用非跟踪查询。可以将单个查询替换为非跟踪查询。
var blogs = contextBlogs
//不用跟踪查询
AsNoTracking()
ToList();
//或者在上下文实例级别更改默认跟踪行为
contextChangeTrackerQueryTrackingBehavior = QueryTrackingBehaviorNoTracking;
var blogs = contextBlogsToList();
还是一样老谭秘方事例,当你加上非跟踪查询标识后,无论怎么更改博客链接值,都不会持久化保存数据到数据库中的。
var blogs = _contextBlog
//不用跟踪查询
AsNoTracking()
SingleOrDefault(m => mBlogId == 1);
blogsUrl = "2";
_contextSaveChanges();
直接上图跟踪结果:
在这相信大家从该小节跟踪与非跟踪查询中事例描述中总算对1小节查询生命周期有一定理解吧。
23跟踪和自定义投影
即使查询的结果类型不是实体类型,默认情况下EF Core也会跟踪结果中包含的实体类型。在以下返回匿名类型的查询中,结果集中的Blog实例会被跟踪。
var blog = contextBlogs
Select(b =>
new
{
Blog = b,
PostCount = bPostsCount()
});
如果结果集包含来自LINQ组合的实体类型,EF Core将跟踪它们。
var blog = contextBlogs
Select(b =>
new
{
Blog = b,
Post = bPostsOrderBy(p => pRating)LastOrDefault()
});
如果结果集不包含任何实体类型,则不会执行跟踪。在以下查询中,我们返回匿名类型(具有实体中的某些值,但没有实际实体类型的实例)。查询中没有任何被跟踪的实体。
var blog = contextBlogs
Select(b =>
new
{
Id = bBlogId,
Url = bUrl
});
EF Core支持执行顶级投影中的客户端评估。如果EF Core具体化实体实例以进行客户端评估,则会跟踪该实体实例。此处,由于我们要将blog实体传递到客户端方法StandardizeURL,因此EF Core也会跟踪博客实例。
var blogs = contextBlogs
OrderByDescending(blog => blogRating)
Select(blog => new
{
Id = blogBlogId,
Url = StandardizeUrl(blog)
})
ToList();
public static string StandardizeUrl(Blog blog)
{
var url = blogUrlToLower();
if (!urlStartsWith(">
Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。
EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:
使 NET 开发人员能够使用 NET 对象处理数据库。
无需再像通常那样编写大部分数据访问代码。
EF Core 支持多个数据库引擎,请参阅数据库提供程序了解详细信息。
对于 EF Core,使用模型执行数据访问。 模型由实体类和表示数据库会话的上下文对象构成。 上下文对象允许查询并保存数据。 有关详细信息,请参阅创建模型。
EF 支持以下模型开发方法:
从现有数据库生成模型。
对模型手动编码,使其符合数据库。
创建模型后,使用 EF 迁移从模型创建数据库。 模型发生变化时,迁移可让数据库不断演进
1、where型子查询
(把内层查询结果当作外层查询的比较条件)
#不用order by 来查询最新的商品
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
#取出每个栏目下最新的产品(goods_id唯一)
select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id);
2、from型子查询
(把内层的查询结果供外层再次查询)
#用子查询查出挂科两门及以上的同学的平均成绩
思路:
#先查出哪些同学挂科两门以上
select name,count() as gk from stu where score < 60 having gk >=2;
#以上查询结果,我们只要名字就可以了,所以再取一次名字
select name from (select name,count() as gk from stu having gk >=2) as t;
#找出这些同学了,那么再计算他们的平均分
select name,avg(score) from stu where name in (select name from (select name,count() as gk from stu having gk >=2) as t) group by name;
3、exists型子查询
(把外层查询结果拿到内层,看内层的查询是否成立)
#查询哪些栏目下有商品,栏目表category,商品表goods
select cat_id,cat_name from category where exists(select from goods where goodscat_id = categorycat_id);
请问垮服务器没?如果没在一个服务器上,就使用链接服务器,实现跨库查询比较容易,如果在同一个服务器上,实现跨库查询,就使用select from dbnamedbotable1
A、B两个数据库在同一个服务器上?
可以用触发器实现,如果A、B数据库的数据都会变化的话,那么两边都要建立触发器,比如A库a表上建立触发器(增删改都需要,只举插入触发器的例子)
select@字段1=字段1,@字段2=字段2,@主键=主键
frominserted
ifexists(selectfromBdboawhere主键=@主键)
begin
--如果有重复的数据怎么处理?是报错,还是不做任何处理直接return,在这里写语句
end
insertintoBdboa(字段1,字段2)
values(@字段1,@字段2)
如果不在同一台服务器上,用触发器就不太保险,因为如果其中一台服务器出了故障,对表的增删改 *** 作都会出问题,除非你能保证两台服务器都能运行正常,或者可以在很短的时间内排除故障。
以上就是关于c# EF 数据库连接全部的内容,包括:c# EF 数据库连接、efcore检测数据是不是创建、ef什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)