我在EF6中看到了一个新功能,即异步方法.我找到了一个例子.
第一种方式是普通呼叫,例如EF5:
public Store FindClosestStore(DbGeography location)
{
using (var context = new StoreContext())
{
return (from s in context.Stores
orderby s.Location.Distance(location)
select s).First();
}
}
Run Code Online (Sandbox Code Playgroud)
和新的调用,在EF6中使用异步方法.
public async Task<Store> FindClosestStore(DbGeography location)
{
using (var context = new StoreContext())
{
return await (from s in context.Stores
orderby s.Location.Distance(location)
select s).FirstAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我可以执行以下操作(语法是aprox,我是通过内存执行的):
public async Task<Store> MyAsyncMethod(DbGeography location)
{
return await Task.Run(() => FindClosestStore());
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,我可以使用Task.Run调用第一个方法,即没有异步,等待结果.目前,是我用来调用异步任何方法的方式,而不仅仅是EF.这也是异步调用,或者当我使用EF6异步方法时真正的异步调用?
为什么在新版本的EF6中需要异步方法?只是为了简单?
我想在C#4.0中使用async/await,直到知道,我已经使用了异步CTP v3,但似乎这是一个不好的选择,如果我使用VS2012则更多.
在VS2012中,至少有两个选项,Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async.
第一个,Microsoft.Bcl.Async(Bcl),已经发布晚于AsyncTargetingPack(ATP),但Bcl是beta.
然而,ATP适用于目标是银光5或.NET 4.0的项目,而Bcl似乎可以与银光4,银光5,Windows Phone 7.5和.NET 4.0兼容.
ATP已被弃用?是兼容还是他们是不同的实现,如果我使用一个我总是必须使用相同的?
哪个是最好的选择?
我想定义一个自定义异常,我想知道我是否可以包含一个类而不是字符串作为消息.原因是我想在一个更灵活的结构中发送额外的信息.
我正在使用EF 4.0,我想使用隔离级别serializable
,因为在事务中我想在读取时阻塞寄存器.
好吧,在SQL Server中我尝试使用此命令更改隔离级别:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Run Code Online (Sandbox Code Playgroud)
在C#中,我使用此代码尝试阻止寄存器:
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable }))
{
Entities myContext = new Entities();
string colors = "select * from Colors where IDColor = 2";
Colors myColor = myContext.Colors.SqlQuery(colors).FirstOrDefault<Colors>();
myColor.Color = "Red";
myContext.SaveChanges();
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
如果我逐行执行我的代码,如果我得到SaveChanges
但仍然没有执行,如果我使用SQL Server Management Studio查询表颜色,我可以获取记录.
然后,如果我执行保存更改并且我得到了scope.Clompete()
,如果我使用Management Studio尝试查询,我什么也得不到,因为寄存器被阻止,所以当我完成我的C#代码时,寄存器被释放,我得到了结果管理工作室.
所以我的问题是,如何在C#中使用可序列化的隔离级别?难道我做错了什么?
PS:我注意到如果我使用这个命令:
DBCC useroptions;
Run Code Online (Sandbox Code Playgroud)
我看到隔离级别是serializable
,但是如果我关闭Management Studio并再次连接并且看到隔离级别是默认值readCommitted
.
所以我的问题是如何设置我的数据库的默认隔离级别.
我正在使用Entity Framework 4.0,我想使用以下查询:
为此,我执行以下操作:
strSQLQuery = "select * from MyTable where IDData IN (@IDs)";
lstParameters.Clear();
myParameter = new SqlParameter("@IDs", strIDs);
lstParameters.Add(myParameter);
myContext.MyTable.SqlQuery(strSQLQuery, lstParameters.ToArray<object>()).ToList<MyTable>();
Run Code Online (Sandbox Code Playgroud)
但我得到一个例外,说它无法转换nvarchar
为bigint
.
这是因为参数是类型字符串,表中的ID是bigint
.
我尝试创建一个long列表并添加一些ID,但我得到其他错误.
如何在查询中使用列表o ID作为参数?
我想使用参数,如果可能的话.
谢谢.
我正在使用EF5,当关系为1:N时,如果我想加载相关实体,我会执行以下操作:
使用T-SQL,我从数据库加载带有T-SQL的主要实体,如下所示:
select *
from MainEntities
where ...
Run Code Online (Sandbox Code Playgroud)使用T-SQL我加载相关的实体
select *
from RelatedEntities
where IDMainEntity IN (---)
Run Code Online (Sandbox Code Playgroud)此时,EF使用相关实体填充主要实体的属性导航.另外,在每个实体的类型的本地属性中,dbContext
我拥有每种类型的所有实体.
但是,如果我使用N:N关系做同样的事情,我没有关系中间表的实体,当我执行查询时,我在dbContext
每个类型的实体的本地执行,但是未填充属性导航.
我想知道为什么以及它是否存在替代方案.
我使用这种方式是因为我想使用T-SQL来创建动态查询.如果我使用预先加载,那么动态查询的灵活性与使用TSQL时不同,效率较低.如果我使用显式加载我做N个额外的查询,主要实体的结果中的每个记录之一用我的方式,我只有一个额外的查询,因为我一次得到所有相关的实体.如果我使用延迟加载我有同样的问题,N个额外的查询.
当关系为N:N时,为什么EF不会填充相关属性?
谢谢.
我正在使用IEnumerable,在调试器中我想看到它有的项目,但我不能,因为没有任何属性也没有项目.
是否可以看到具有IEnumerable的项目?
我正在开发一个 UWP 应用程序(Windows 手机 10),并且我在 LAN 中的 PC 的共享文件夹中有一个 SQLite 数据库。我想知道我是否可以在 windows phone 应用程序中使用这个数据库,就像我在我的 WPF 应用程序中所做的那样,我可以设置数据库的路径,我可以在我的局域网中的任何计算机上使用它。
谢谢。
我有两个项目的解决方案,一个是主项目,第二个是将使用EF Core 10.0 RC2的项目。
在第二个项目中,我使用以下三个命令安装EF Core,并运行以下nuget命令进行安装:
Install-Package Microsoft.EntityFrameworkCore.SqlServer –Pre
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design –Pre
Run Code Online (Sandbox Code Playgroud)
稍后,我可以使用以下命令从数据库创建模型:
Scaffold-DbContext "'Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;'" Microsoft.EntityFrameworkCore.SqlServer
Run Code Online (Sandbox Code Playgroud)
问题是,如果我退出VS2015并再次打开,如果我尝试运行相同的命令来再次生成模型,则会收到此错误:
术语'Scaffold-DbContext'不被视为cmdlet的名称。
我不知道这是什么问题,我尝试安装了entityFrameworks.Commands,但问题仍未解决。
我有一个.net 4.7项目,它安装了System.Runtime的4.3.0版本.但是当我运行项目时,我得到一个异常,说它找不到版本4.1.0.0.
如果我去nuget管理器,我在项目中安装了4.1.0.0版本,然后就可以了.所以我试图再次更新到4.3.0版本,但同样,我遇到了问题.
该项目一直工作到现在,我真的不知道为什么它停止工作,因为我没有触及任何与nuget包相关的东西.
此外,我试图创建一个新的空解决方案并添加项目,尝试一个新的解决方案,但问题是相同的.
我怎么能解决这个问题?
谢谢.
c# ×9
async-await ×2
asynchronous ×1
cmdlet ×1
debugging ×1
exception ×1
many-to-many ×1
nuget ×1
parameters ×1
sqlite ×1
transactions ×1