因此,EntityFramework 6比以前的版本更易于测试.对于像Moq这样的框架,互联网上有一些不错的例子,但情况是,我更喜欢使用NSubstitute.我已经将"非查询"示例翻译为使用NSubstitute,但我无法理解"查询测试".
Moq如何items.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider);转化为NSubstitute?我觉得这样的事情((IQueryable<T>) items).Provider.Returns(data.Provider);却没有用.我也尝试过,items.AsQueryable().Provider.Returns(data.Provider);但也没用.
我得到的例外是:
"System.NotImplementedException:成员'IQueryable.Provider'尚未在类型'DbSet
1Proxy' which inherits from 'DbSet1' 上实现.'DbSet`1 '的测试双精度必须提供所使用的方法和属性的实现."
所以让我引用上面链接中的代码示例.此代码示例使用Moq来模拟DbContext和DbSet.
public void GetAllBlogs_orders_by_name()
{
// Arrange
var data = new List<Blog>
{
new Blog { Name = "BBB" },
new Blog { Name = "ZZZ" },
new Blog { Name = "AAA" },
}.AsQueryable();
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new …Run Code Online (Sandbox Code Playgroud) 我有以下代码(数据库是SQL Server Compact 4.0):
Dim competitor=context.Competitors.Find(id)
Run Code Online (Sandbox Code Playgroud)
当我对此进行分析时,Find方法需要300 + ms才能从仅有60条记录的表中检索竞争对手.
当我将代码更改为:
Dim competitor=context.Competitors.SingleOrDefault(function(c) c.ID=id)
Run Code Online (Sandbox Code Playgroud)
然后在3毫秒内找到竞争对手.
竞争者类:
Public Class Competitor
Implements IEquatable(Of Competitor)
Public Sub New()
CompetitionSubscriptions = New List(Of CompetitionSubscription)
OpponentMeetings = New List(Of Meeting)
GUID = GUID.NewGuid
End Sub
Public Sub New(name As String)
Me.New()
Me.Name = name
End Sub
'ID'
Public Property ID As Long
Public Property GUID As Guid
'NATIVE PROPERTIES'
Public Property Name As String
'NAVIGATION PROPERTIES'
Public Overridable Property CompetitionSubscriptions As ICollection(Of CompetitionSubscription)
Public Overridable Property …Run Code Online (Sandbox Code Playgroud) entity-framework ef-code-first sql-server-ce-4 dbcontext dbset
当我迭代通过ObjectStateEntries我期望[t]变量名称将是MY_ENTITY
foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted))
{
Type t = entry.Entity.GetType();
...
}
Run Code Online (Sandbox Code Playgroud)
但我是真实的
System.Data.Entity.DynamicProxies.MY_ENTITY_vgfg7s7wyd7c7vgvgv.....
Run Code Online (Sandbox Code Playgroud)
如何确定可以将当前条目转换为MY_ENTITY类型?
c# entity-framework objectstatemanager ef-code-first dbcontext
我遇到了一个我自己无法解决的问题,所以我寻求帮助。
\n我最近开始学习 ASP.NET Core,想要构建一个库,其中我必须拥有数据库、登录系统和管理员权限,以便能够从网站添加和删除书籍。
\n我已经创建了登录系统和数据库,现在我想将CRUD添加到项目中,但弹出此错误:
\n“\'尝试激活“LibraryData.LibraryContext”时无法解析类型 \xc2\xa8Microsoft.entityFrameworkCore.DbContextOptions\xc2\xa81[LibraryData.LibraryContext] 的服务
\n这是我到目前为止的代码......
\npublic class LibraryContext : DbContext\n{\n public LibraryContext(DbContextOptions<LibraryContext> options) : base(options)\n {\n\n }\n\n public DbSet<User> Users { get; set; }\n public DbSet<Video> Videos { get; set; }\n public DbSet<BranchHours> BranchHour { get; set; }\n public DbSet<Checkout> checkouts { get; set; }\n public DbSet<CheckoutHistory> checkoutHistorys { get; set; }\n public DbSet<Holds> holds { get; set; }\n public DbSet<LibraryAsset> LibraryAssets { get; set; }\n …Run Code Online (Sandbox Code Playgroud) MVC 3 + EF 4.1
我在两种方法中选择处理DbContext:
Application_BeginRequest,投入
HttpContext.Current.Items和处置Application_EndRequest.DbContext),并启动每个控制器操作using(var unitOfWork = new
UnitOfWork()) { ... }请分享您的经验:您更喜欢哪一个?每种方法的利弊是什么?
asp.net-mvc entity-framework poco entity-framework-4.1 dbcontext
有没有之间的差异显著.Find(id),并.Where(x = >x.Id == id)应该强迫我使用.Find()过.Where()/.First()?
我认为.Find()这会更有效但是我应该避免这么高效.Where()/.First()吗?
我问的原因是我在我的测试中使用了一个通用的FakeDbSet,以便轻松实现假结果,到目前为止,我发现我必须继承该类并提供自定义实现,.Find()而如果我编写代码,.Where()/.First()我就不要我不需要做那些额外的工作.
在我的解决方案中,我有两个使用Entity Framework 6的项目.每个项目指向不同的数据库,两者都使用相同的数据提供 - SQL Server.我的解决方案中的第三个项目需要使用这两个数据库.我的问题是如何配置这些上下文.我尝试在单独的程序集中创建配置类:
namespace OSAD_Base
{
class EfDbConfiguration : DbConfiguration
{
public EfDbConfiguration()
{
SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance);
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在每个上下文类中引用此配置:
namespace IntegrationDb
{
[DbConfigurationType("OSAD_Base.EfDbConfiguration, OSAD_Base")]
public partial class IntegrationEntities : DbContext
{
public IntegrationEntities(string connectionString)
: base(connectionString)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
初始化我的第一个时,所有工作都正确,但是当第二个上下文初始化时(顺序无关紧要)我得到并且错误:
设置了'EfDbConfiguration'的实例,但是在与'B1Entities'上下文相同的程序集中未发现此类型.将DbConfiguration类型放在与DbContext类型相同的程序集中,在DbContext类型上使用DbConfigurationTypeAttribute指定DbConfiguration类型,或在配置文件中设置DbConfiguration类型.有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260883.*
我还试图在我的app.config(启动项目)中创建一个entityframework部分,但是出现了以下错误:
配置系统无法初始化
无法识别的配置部分entityFramework
如何在同一解决方案中使用2个单独的EF项目?
我有一个使用EF作为ORM的应用程序.数据库曾经有一个架构,dbo,一切都运行正常.我最近将我的表组织成4种不同的模式.一个模式的某些表依赖于驻留在不同模式上的表.所有似乎都在SQL方面有效.
在应用程序端,通过EF的所有数据库交互都不再起作用.代码编译,模式在解决方案中可见,模型映射指向正确的模式,但是一旦我尝试向表中插入行,它就不起作用.
我看过一些关于使用多个模式的帖子需要使用多个DBContexts,但我宁愿使用一个DBContext.我的所有模式都拥有相同的所有者dbo,我没有看到使用多个DBContexts的原因.
有谁知道是否有办法实现这一目标?
注意:我使用的是Entity Framework第5版
在我的通用库,我有Add,Edit和Delete下面的方法:
public class EntityRepository<T> : IEntityRepository<T>
where T : class, IEntity, new() {
readonly DbContext _entitiesContext;
public EntityRepository(DbContext entitiesContext) {
if (entitiesContext == null) {
throw new ArgumentNullException("entitiesContext");
}
_entitiesContext = entitiesContext;
}
//...
public virtual void Add(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State != EntityState.Detached) {
dbEntityEntry.State = EntityState.Added;
}
else {
_entitiesContext.Set<T>().Add(entity);
}
}
public virtual void Edit(T entity) {
DbEntityEntry dbEntityEntry = _entitiesContext.Entry<T>(entity);
if (dbEntityEntry.State == …Run Code Online (Sandbox Code Playgroud) 在这个简单的例子中,我有两个实体:Event和Address.我每晚都运行一个控制台应用程序来从XML源导入事件数据并将其添加到我的数据库中.
当我遍历XML事件节点(在Entity Framework上下文中)时,我检查是否有数据库中已存在给定值的地址记录.如果没有,它会添加一条新记录.
using (DemoContext context = new DemoContext())
{
foreach (XmlNode eventNode in eventsXml.SelectNodes("/Events/Event"))
{
Event newEvent = new Event();
newEvent.Title = **get from XML**
Address address = context.Addresses.Where(a =>
a.Title.Equals(title, StringComparison.OrdinalIgnoreCase) &&
a.Address1.Equals(address1, StringComparison.OrdinalIgnoreCase) &&
a.Address2.Equals(address2, StringComparison.OrdinalIgnoreCase) &&
a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
a.State.Equals(state, StringComparison.OrdinalIgnoreCase) &&
a.ZipCode.Equals(zipCode, StringComparison.OrdinalIgnoreCase)
).FirstOrDefault();
if (address != null)
newEvent.Location = address;
else
{
newEvent.Location.Title = title;
newEvent.Location.Address1 = address1;
newEvent.Location.Address2 = address2;
newEvent.Location.City = city;
newEvent.Location.State = state;
newEvent.Location.ZipCode = zipCode;
}
context.Events.Add(newEvent);
}
context.SaveChanges(); …Run Code Online (Sandbox Code Playgroud) c# entity-framework savechanges dbcontext entity-framework-5
dbcontext ×10
c# ×5
.net ×2
dbset ×2
asp.net-core ×1
asp.net-mvc ×1
db-schema ×1
nsubstitute ×1
performance ×1
poco ×1
savechanges ×1