我有一堂这样的课:
[Table("member_activation")]
public partial class MemberActivation
{
[Key]
public Int64 member_id { get; set; }
public String token { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的数据库:
public class SMADbContext : DbContext
{
public SMADbContext() : base("SMADB")
{
Database.SetInitializer<SMADbContext>(new NullDatabaseInitializer<SMADbContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
public DbSet<Member> Members { get; set; }
public DbSet<MemberActivation> MemberActivations { get; set; }
public DbSet<ApiAccount> ApiAccounts { get; set; }
public DbSet<ApiHardware> ApiHardwares { get; set; }
public DbSet<MemberRelation> MemberRelations { get; set; …Run Code Online (Sandbox Code Playgroud) 我有一个 Moq DbSet,直到最近一直在工作,但是自从上次更新依赖项以来,它一直在抛出一个NotImplementedExceptiononIQueryable.Provider
使用的代码如下:
var mockSet = new Mock<DbSet<A>>();
var list = new List<A>();
var queryable = list.AsQueryable();
mockSet.As<IQueryable<A>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockSet.As<IQueryable<A>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockSet.As<IQueryable<A>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockSet.As<IQueryable<A>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
var f =mockSet.Object.FirstOrDefault(); // NotImplementedException thrown here
Run Code Online (Sandbox Code Playgroud)
抛出的异常如下:
System.NotImplementedException
The member 'IQueryable.Provider' has not been implemented on type
'DbSet`1Proxy_1' which inherits from 'DbSet`1'.
Test doubles for 'DbSet`1' must provide implementations of methods
and properties that are used.
Run Code Online (Sandbox Code Playgroud) 有没有办法从DbSet继承?我想添加一些新属性,如下所示:
public class PersonSet : DbSet<Person>
{
public int MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在我的DbContext中实例化它
public partial MyContext : DbContext
{
private PersonSet _personSet;
public PersonSet PersonSet
{
get
{
_personSet = Set<Person>(); // Cast Error here
_personSet.MyProperty = 10;
return _personSet;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
考虑以下课程:
class MyContext : DbContext
{
public DbSet<Order> Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并实例化一个新对象:
var mycontext = new MyContext();
Run Code Online (Sandbox Code Playgroud)
为什么mycontext.Orders不为null?什么时候初始化?谁初始化了它?我真的很困惑,因为基类(DbConetxt)无法访问派生类属性,因此不可能在基础对象中初始化自动属性.
我想知道是否有人在FakeItEasy 这篇文章中有类似的例子(原帖是在这里.我一直试图找到正确的设置,但无法正确.我在网上找不到任何例子.我开始教我自己单元测试,我决定使用FakeItEasy.到目前为止,我所有的项目都使用实体框架而不使用Repository/UOW模式,因为我认为DbSet和DbContext足以满足我的小规模应用程序.我明白有利可图EF和单元测试,但我仍然想知道这一点.我很确定我的尝试(见下文)我已经离开了,因为我得到的错误是
System.NotImplementedException:成员'IQueryable.Provider'尚未在类型'DbSet
1Proxy' which inherits from 'DbSet1'上实现.'DbSet`1'的测试双精度必须提供所使用的方法和属性的实现.
任何方向都会非常有帮助.谢谢.
var data = new List<Request>
{
request1,
request2,
request3
}.AsQueryable();
var fakeDbSet = A.Fake<DbSet<Request>>();
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Provider).Returns(data.Provider);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Expression).Returns(data.Expression);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).ElementType).Returns(data.ElementType);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).GetEnumerator()).Returns(data.GetEnumerator());
var fakeContext = A.Fake<RequestPortalContext>();
A.CallTo(() => fakeContext.Requests).Returns(fakeDbSet);
var service = new RequestReadService(fakeContext);
var requests = service.GetAllRequests();
Assert.AreEqual(3, requests.Count);
Assert.AreEqual("Test1", requests[0].Name);
Assert.AreEqual("Test2", requests[1].Name);
Assert.AreEqual("Test3", requests[2].Name);
Run Code Online (Sandbox Code Playgroud) 如何使用不是主键的键获取结果列表?更具体地说,我有一个复合主键,我想用一列的参数检索所有匹配.
我想,在Controller的ActionResult中,它就像是
tableModel tbmodel = db.tableModels.Find(i => i.partialPK == parameter)
Run Code Online (Sandbox Code Playgroud)
但情况并非如此,因为Find()仅适用于整个PK.
我在实体模型类中声明了我的PK:
[Key]
[Column(Order = 0)]
public int PK1 { get; set; }
[Key]
[Column(Order = 1)]
public string PK2 { get; set; }
Run Code Online (Sandbox Code Playgroud) 我传递了一个我要查询的实体类型名称的字符串,并根据字符串获取类型.我想得到DbSet回来并返回IQueryable.问题出在我正在做的事情(DbSet<tableEntity>)并收到以下错误:
tableEntity是一个变量,但像类型一样使用
当试图施放.有办法解决这个问题吗?
public object GetList(string tableEntity)
{
Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject");
var dbObject = (DbSet<tableEntity>)typeof(DbContext).GetMethod("Set", Type.EmptyTypes)
.MakeGenericMethod(tableEntity)
.Invoke(databaseContext, null);
return dbObject.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
编辑
只是要添加我无法访问我们通过字符串传递名称的类型.
我的数据库上下文类如下
public class DataContext : DbContext
{
public DataContext(DbContextOptions options) : base(options)
{
}
public DbSet<Customer> Customers;
public DbSet<Order> Orders;
}
Run Code Online (Sandbox Code Playgroud)
它警告说
non-nullable property 'Orders' must contain a non-null value when exiting the constructor. Consider declaring the property as nullable
Run Code Online (Sandbox Code Playgroud)
我手头上有两个选择可以解决,但不确定哪个是好的。
选项 1) 使属性可为空
public DbSet<Order>? Orders;
Run Code Online (Sandbox Code Playgroud)
选项 2) 在构造函数中将属性设置为空集
public DataContext(DbContextOptions options) : base(options)
{
this.Orders = this.Set<Order>();
}
Run Code Online (Sandbox Code Playgroud)
哪一个是解决此警告的最佳选项,并且还支持测试用例。?
我如何使用|| (或)lambda表达式中的运算符?
这是我尝试过的:
db.assets.Where((u => u.userName.Equals(userName)) || (c => c.category.Equals("DefaultMapMarker"))
Run Code Online (Sandbox Code Playgroud)
提前致谢
编辑
我想获得当前用户的资产列表,以及所有用户的所有资产.所有用户的资产都有一个DefaultMapMarker类别.
在使用中Entity Framework Database First,
为什么在我的任何DbContext Sets一个中发出Create方法会创建一个set实体的实例而不增加其Identity列?
考虑到我构建了我想要首先添加到给定集合的所有实体,并且最后只有一次,我将它们全部添加到DbContext.SaveChanges()- DbSet.Create()如果不是属性初始化标识列,那么真正使用的是什么?我可以简单地手动实例化我的DbSetasvar newEntity = new MyClass();
我想在我的ASP .Net Core 3.0 Web API中查询MySql数据库,并有条件地应用一些WHERE筛选器。所以我在我的控制器动作之一中有这个:
[HttpGet]
public async Task<IEnumerable<Customer>> GetCustomers([FromQuery] bool? isActive, [FromQuery] int? typeId, [FromQuery] bool? isProcessed)
{
var customers = _context.Customers.Where(c => c.IsDeleted == false);
if (isActive.HasValue)
customers = customers.Where(c => c.IsActive == isActive.Value);
if (typeId.HasValue)
customers = customers.Where(c => c.TypeId == typeId.Value);
if (isProcessed.HasValue)
customers = customers.Where(c => c.IsProcessed == isProcessed.Value);
return await customers.ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
这完美地工作了,因为在第一行中有一个Where子句:
var customers = _context.Customers.Where(c => c.IsDeleted == false);
Run Code Online (Sandbox Code Playgroud)
但实际上我不想放入Where子句。我只想要这样:
[HttpGet]
public async Task<IEnumerable<Customer>> GetCustomers([FromQuery] bool? isActive, [FromQuery] int? typeId, [FromQuery] …Run Code Online (Sandbox Code Playgroud) dbset ×11
c# ×6
dbcontext ×4
asp.net ×1
asp.net-mvc ×1
database ×1
fakeiteasy ×1
find ×1
inheritance ×1
iqueryable ×1
lambda ×1
linq ×1
moq ×1
or-operator ×1
reflection ×1
types ×1
unit-testing ×1
warnings ×1