Tag: dbset

DbContext类的IDbSet属性的适配器模式

有没有办法使用此答案中描述的方法IDbSet上没有FindAsync()方法DbContext的DbSet属性? 编辑: 链接的答案包含如何构建inheritance自IDbSet的接口以及添加对DbSet类的SearchAsync方法的支持的描述。 我理解Keith Payne编写的所有内容,但我不知道如何在DbContext中使用它。 例如,我有一个看起来像这样的DbContext: public class MyContext : DbContext { public DbSet Customers { get; set; } } 我如何使用MyDbSet(答案中描述的类)或类似的类,而不是DbSet? public class MyContext : DbContext { public MyDbSet Customers { get; set; } } 问题是,Entity Framework似乎只为IDbSet或DbSet类型的属性生成表。

使用带有NSubstitute的DbSet 和IQueryable 操作对象会返回错误

我想使用NSubstitute通过模拟DbSet对Entity Framework 6.x进行unit testing。 幸运的是, Scott Xu使用Moq提供了一个很好的unit testing库EntityFramework.Testing.Moq 。 因此,我修改了他的代码以适合NSubstitute并且它一直看起来很好,直到我想测试DbSet.Add() , DbSet.Remove()方法。 这是我的代码位: public static class NSubstituteDbSetExtensions { public static DbSet SetupData(this DbSet dbset, ICollection data = null, Func find = null) where TEntity : class { data = data ?? new List(); find = find ?? (o => null); var query = new InMemoryAsyncQueryable(data.AsQueryable()); […]

是DbSet 。本地使用的东西需要特别小心吗?

几天来,我一直在努力从存储库( DbContext )中检索我的实体。 我试图在primefaces动作中保存所有实体。 因此,不同的实体一起代表了对我有价值的东西。 如果所有实体都是“有效”,那么我可以将它们全部保存到数据库中。 实体“a”已存储在我的存储库中,需要检索以“validation”实体“b”。 这就是问题出现的地方。 我的存储库依赖于DbSet类,它与Linq2Sql( Include()导航属性(例如))配合使用。 但是, DbSet不包含处于“已添加”状态的实体。 所以我(据我所知)有两个选择: 使用ChangeTracker查看哪些实体可用,并根据其EntityState将它们查询到一个集合中。 使用DbSet.Local属性。 ChangeTracker似乎需要一些额外的努力来让它以某种方式工作,以便我可以使用Linq2Sql来Include()导航属性,例如 DbSet.Local对我来说似乎DbSet.Local 。 它可能只是名字。 我只是读了一些表现不佳的东西(比DbSet 本身慢)。 不确定这是否是虚假陈述。 具有重要EntityFramework经验的人能否对此有所了解? 什么是“明智”的道路? 或者我看到了幽灵,我应该总是使用.Local属性吗? 使用代码示例更新 : 出了什么问题的一个例子 public void AddAndRetrieveUncommittedTenant() { _tenantRepository = new TenantRepository(new TenantApplicationTestContext()); const string tenantName = “testtenant”; // Create the tenant, but not call `SaveChanges` yet until all entities are […]

如何将项添加到Mock DbSet(使用Moq)

我正在尝试设置一个模拟DbSet用于测试目的。 我在这里使用了这个教程, http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) 。 但是,我在向DbSet添加项目时遇到困难。 输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助。 static void Main(string[] args) { Debug.WriteLine(“hello debug”); List stringList = new List { “a”, “b”, “c” }; DbSet myDbSet = GetQueryableMockDbSet(stringList); int preCount = myDbSet.Count(); myDbSet.Add(“d”); int postCount = myDbSet.Count(); Debug.WriteLine(“preCount = ” + preCount + ” postCount = […]

X是一个变量,但在尝试投射时使用的类似

我传递了一个我要查询的实体类型名称的字符串,并根据字符串获取类型。 我想让DbSet返回并返回IQueryable 。 问题是我在做什么(DbSet)并得到以下错误: tableEntity是一个变量,但像类型一样使用 当试图施放。 有办法解决这个问题吗? public object GetList(string tableEntity) { Type tableEntity = Type.GetType(“TestProject.” + typeName + “, TestProject”); var dbObject = (DbSet)typeof(DbContext).GetMethod(“Set”, Type.EmptyTypes) .MakeGenericMethod(tableEntity) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 编辑 只是要添加我无法访问我们通过字符串传递名称的类型。

Moq DbSet NotImplementedException

我有一个直到最近一直工作的Moq DbSet,但是自上次更新依赖项以来,它一直在IQueryable.Provider NotImplementedException 。 代码使用如下: var mockSet = new Mock<DbSet>(); var list = new List(); var queryable = list.AsQueryable(); mockSet.As<IQueryable>().Setup(m => m.Provider).Returns(queryable.Provider); mockSet.As<IQueryable>().Setup(m => m.Expression).Returns(queryable.Expression); mockSet.As<IQueryable>().Setup(m => m.ElementType).Returns(queryable.ElementType); mockSet.As<IQueryable>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator()); var f =mockSet.Object.FirstOrDefault(); // NotImplementedException thrown here 引发的exception如下: System.NotImplementedException The member ‘IQueryable.Provider’ has not been implemented on type ‘DbSet`1Proxy_1’ which inherits from […]

DbSet.Cast ()错误:无法从非genericsDbSet为“实体”类型的对象创建DbSet

版本信息: 我正在使用C#4.5,Entity Framework 6.0和MEF。 代码和unit testing 我创建了一个测试项目来解释这个问题: https : //skydrive.live.com/redir?resid = E3C97EC293A34048!2234 请打开UnitTest项目并尝试运行TestIfItWorks()unit testing。 问题 我想将非genericsDbSet转换为其通用版本,但是我得到以下exception: InvalidCastException: Cannot create a DbSet from a non-generic DbSet for objects of type ‘User’ : var nonGeneric = context.Set(typeof(User)); var generic = nonGeneric.Cast(); //Exception in here User类正在实现IUser,所以你会认为强制转换不应该是一个问题,除非DbSet代码被限制在具体的类中(我希望不是我需要创建一个围绕非genericsDbSet的包装器将它转换为genericsDbSet或找到当前DbSet实现的替代方案)。 如果你想知道为什么我使用接口,即使它们目前不受微软支持我给你一些解释(希望这会过滤掉“不要那样做”而不是提供解决方案的响应): 我正在使用MEF和EntityFramework创建一个松散耦合的数据层引擎,通过它我可以为每个项目提供实体(及其相应的配置)。 我一直在广泛使用Interfaces来定义引擎。 使用MEF在运行时发现元数据和上下文中实体的具体实现。 摘自代码 [TestMethod] public void TestIfItWorks() { //TODO: Please […]

在Entity Framework中动态创建DbSet ?

在LINQ to SQL中,我可以使用DataContext.GetTable动态创建存储库。 除了在特定的DbContext上声明属性之外,是否有类似的方法在Entity Framework 4中执行此DbContext ? 例如: public MyDbContext: DbContext { public DbSet MySets {get; set;} } 我想知道如何动态创建/获取对MySets的引用,就像我在LINQ to SQL中一样: var mySet = MyDbContext.GetTable();

循环派生的DbContext DbSets,这样我就可以在我的DbContext对象中添加一个ClearAll()扩展

基于[ Type.IsGenericType和Type.IsGenericTypeDefinition ] [1]之间的差异,我获得了我缺少的信息,以便能够通过Reflection检索DbContext的DbSet。 但是,我现在被困在其他地方。 在下面的代码示例中,我确实成功获取了DbSetgenerics实例,但我现在希望能够在编译时将它们转换为特定的generics类型定义。 dbSet是来自我的DbContext的DbSets 之一的真实实例,但是如何将它转换为真正的类型定义? (进行第一次循环迭代,dBSet将代表DbSet – 如何在编译时对此变量强制执行此类型? 更新 :我刚刚审查了我要做的事情……恐怕没有意义/这是不可能的。 由于真实类型仅在运行时被发现,因此我无法在此之前(并且编译时间是之前的某个阶段)与真实的generics类型相关。 在任何情况下 – 我真正感兴趣的是,在编译时,IDE显示IEnumerable成员(DbSet 实现它)。 所以我真的需要把它转换为DbSet 。 这样的演员怎么样? 可能吗 ?! private static void Main(string[] args) { MyDb myDb = new MyDb(); List dbSetProperties = myDb .GetType() .GetProperties() .Where(pi => pi.PropertyType.IsGenericType && string.Equals(pi.PropertyType.GetGenericTypeDefinition().FullName, typeof(DbSet).FullName, StringComparison.OrdinalIgnoreCase)).ToList(); foreach (PropertyInfo dbSetProperty in dbSetProperties) { Type[] typeArguments […]

你能从DbSet获得DbContext吗?

在我的应用程序中,有时需要在一次操作中将10,000行或更多行保存到数据库中。 我发现,简单地迭代并逐个添加每个项目可能需要花费半个多小时。 但是,如果我禁用AutoDetectChangesEnabled它需要约5秒(这正是我想要的) 我正在尝试向DbSet创建一个名为“AddRange”的扩展方法,该方法将禁用AutoDetectChangesEnabled,然后在完成时重新启用它。 public static void AddRange(this DbSet set, DbContext con, IEnumerable items) where TEntity : class { // Disable auto detect changes for speed var detectChanges = con.Configuration.AutoDetectChangesEnabled; try { con.Configuration.AutoDetectChangesEnabled = false; foreach (var item in items) { set.Add(item); } } finally { con.Configuration.AutoDetectChangesEnabled = detectChanges; } } 所以,我的问题是:有没有办法从DbSet获取DbContext? 我不喜欢把它作为参数 – 感觉它应该是不必要的。