我有一个方法,其中包含对EF.Functions.Contains
. 现在我想使用 InMemory 数据库为此方法编写单元测试,但我立即收到以下异常System.InvalidOperationException : The 'Contains' method is not supported because the query has switched to client-evaluation.
我的方法看起来像这样
var attributeValues = Context.AssetAttributeValues
.Include(a => a.AssetAttribute)
.Include(a => a.Asset)
.Where(i => EF.Functions.Contains(i.Value, searchString));
Run Code Online (Sandbox Code Playgroud)
我知道抛出此异常是因为与我的高效 SQL Server 实例相比,我的 InMemory 数据库上没有全文索引,但如何在 InMemory 数据库上获取相同的索引?
有什么办法可以解决这个异常吗?
我正在尝试建立这样的查询
var d = dbContext.Picks
.Where( /* some conditions */ )
.GroupBy(x => new { gameDiff = x.Schedule.GameTotal.Value - x.TieBreakerScore.Value })
.Select(g => new { name = g.Key.firstname, count = g.Count(),
gameDiff = Math.Abs(g.Key.gameDiff) })
.OrderByDescending(x => x.count)
.ThenBy(x => x.gameDiff)
.Take(top)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个我得到
System.Data.SqlClient.SqlException: 'Incorrect syntax near the keyword 'AS'.'
System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Incorrect syntax near the keyword 'AS'.
Source=Core .Net SqlClient Data Provider
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at …
Run Code Online (Sandbox Code Playgroud) 在更改之后或更改之前,我们将实体状态置为=修改是否重要?
using (var db = new LakshyaContext())
{
foreach (var category in db.Categories)
{
db.Entry(category).State = EntityState.Modified; // before
category.Count = 25; //Making Changes
db.Entry(category).State = EntityState.Modified; //After
}
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 我有以下课程:
订购:
public class Order {
private Order()
{
//some code to initialise object
}
//more properties
public Prepayment Prepayment { get; private set; }
//more methods and properties
}
Run Code Online (Sandbox Code Playgroud)
预付款:
public class Prepayment:ValueObject<Prepayment>
{
private Prepayment()
{
}
public Money AmountPrepaid { get; private set; }
public bool HasPrepaymentBeenTaken => AmountPrepaid.Amount > 0;
}
Run Code Online (Sandbox Code Playgroud)
钱:
public class Money {
private Money()
{
}
private Money(decimal amount)
: this()
{
Amount = amount;
}
public decimal Amount { get; private …
Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL,并且我的ApplicationDbContext如下:
public class ApplicationDbContext : DbContext
{
private readonly DatabaseSettings _databaseOptions;
public ApplicationDbContext() { }
public ApplicationDbContext(IOptions<DatabaseSettings> databaseOptions)
{
_databaseOptions = databaseOptions.Value;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("citext");
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (_databaseOptions == null)
{
optionsBuilder.UseInMemoryDatabase(Guid.NewGuid().ToString());
}
else
{
optionsBuilder.UseNpgsql(_databaseOptions.ConnectionString,
npgsqlOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: _databaseOptions.MaxRetryCount,
maxRetryDelay: TimeSpan.FromSeconds(_databaseOptions.MaxRetryDelay),
errorCodesToAdd: null);
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
这种情况是许多其他情况的基础。我正在改善性能并尝试使用上下文池。文档说要添加轮询,我应该:
services.AddDbContextPool<EmployeeContext>(options => options.UseNpgsql(connection));
Run Code Online (Sandbox Code Playgroud)
但我想在OnConfiguring方法中存储.UseNpgsql和DbContext的其他配置。如何实现呢?
我收到以下错误:
错误:SqlException:例程执行或用户定义的聚合“地理”期间的 .NET Framework 错误:System.ArgumentException:24204:空间参考标识符 (SRID) 无效。指定的 SRID 必须与 sys.spatial_reference_systems 目录视图中显示的受支持 SRID 之一匹配。
当我尝试将这样创建的点保存到 SQL DB 时,会引发此错误
new Point(it.Lat, it.Lng)
Run Code Online (Sandbox Code Playgroud)
在那之后,我尝试使用GeometryFactory
这样的:
public static class GeometryHelper
{
public static IGeometryFactory GeometryFactory { get; set; }
= NtsGeometryServices.Instance.CreateGeometryFactory();
}
...
geometryFactory.CreatePoint(new Coordinate(it.Lat, it.Lng))
Run Code Online (Sandbox Code Playgroud)
没事了。
还尝试设置特定的 SRID:
public static class GeometryHelper
{
public static IGeometryFactory GeometryFactory { get; set; }
= NtsGeometryServices.Instance.CreateGeometryFactory(4326);
}
Run Code Online (Sandbox Code Playgroud)
但是然后得到这个错误:
SqlException:例程执行或用户定义的聚合“地理”期间的 .NET Framework 错误:System.FormatException:标识的元素之一的格式无效。System.FormatException:
sql-server spatial geospatial asp-net-core-spa-services ef-core-2.2
我有一个运行良好的 EF Core 2.2 应用程序。然后我介绍程序并知道我可以这样做:
...在我的上下文中
public virtual DbSet<MyProcsDbSet> MyProcsDbSet{ get; set; }
Run Code Online (Sandbox Code Playgroud)
获取数据的示例调用:
using(var context = myContext())
{
var data = context.MyProcsDbSet.ExecuteSQL("Myproc @p0", 1);
}
Run Code Online (Sandbox Code Playgroud)
应该注意这可以正常工作。但是,当我创建一个新的迁移时,它会生成一个表。很好,没什么大不了的,我只是在模型创建中声明不构建该表。
bldr.Ignore<MyProcsDbSet>();
Run Code Online (Sandbox Code Playgroud)
不,现在当我调用正在运行的程序时,我得到了这个:
无法为“MyProcsDbSet”创建 DbSet,因为此类型未包含在上下文的模型中。
有没有办法为过程返回获取 dbset 而不必永远抑制 ef core 创建表的需要? .NET Core EF 代码的能力似乎总是最大的缺点是自定义对象及其创建和检索。
我想运行蓝绿部署;然而,EF 迁移似乎阻止了这一点。如果我将版本 1 部署到蓝色插槽,创建 EF 迁移并将版本 2 部署到绿色插槽,则会发生以下两种情况之一。
场景一:
我将运行迁移,版本 1 将停止工作。这违背了能够在绿色插槽中测试版本 2 同时让我们的用户在蓝色插槽中运行版本 1 的目的。
场景2:
在从蓝色插槽切换到绿色插槽之前,我不会运行迁移。这意味着在允许用户访问版本 2 之前我无法测试绿色插槽(版本 2)。
处理这个问题的标准/最佳实践是什么?
azure blue-green-deployment entity-framework-migrations ef-core-2.2
我在 EF Core 2.0 中有这样的 linq 查询,它可以正常工作,但是当我升级到 EF Core 3.0 时它总是超时。我在query = query.Where(x => x.Questions);
.
我的问题是我想返回带有过滤问题的课程,例如仅 Take(10) 或仅显示特定范围而非所有问题的 .Where 条件。
var query = _courseRepository.Table;
query = query.Where(x => x.Id == id);
query = query.Include(x => x.Questions);
query = query.Include(x => x.CourseYear);
query = query.Include(x => x.CourseSubject);
query = query.Include(x => x.Instructors).ThenInclude(y => y.User);
query = query.Include(x => x.Instructors).ThenInclude(y => y.Course);
query = query.Include(x => x.Instructors).ThenInclude(y => y.CourseClass);
query = query.Include(x => x.CourseSections);
query = query.Include(x => x.CourseSections).ThenInclude(y => …
Run Code Online (Sandbox Code Playgroud) 我在 ASP.NET Core 2.2 应用程序中收到此警告
警告:Microsoft.EntityFrameworkCore.Infrastruct[10402] 已创建 20 多个“IServiceProvider”实例供实体框架内部使用。这通常是由于将新的单例服务实例注入每个 DbContext 实例而引起的。例如,调用 UseLoggerFactory 每次都会传入一个新实例 - 有关更多详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=869049 。考虑检查对“DbContextOptionsBuilder”的调用,这可能需要构建新的服务提供程序。
花了一些时间后我发现它发生在startup.cs中。我正在使用 IdentityServer3 + OpenIDCnnection 进行身份验证。
用户成功登录后,客户端应用程序对用户进行授权,确保用户存在于客户端应用程序的数据库中。
客户端应用程序的Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IAccountService, AccountService>();
services.AddDbContext<Data.Entities.MyDBContext>(options =>
{
options.UseSqlServer(configuration.GetConnectionString("DefaultConnection"),
sqlServerOptions => sqlServerOptions.CommandTimeout(sqlCommandTimeout));
});
services.AddAuthentication(options =>
{
// removed for brevity purpose
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
// removed for brevity purpose
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Events = new OpenIdConnectEvents()
{
OnTokenValidated = async context =>
{
Data.Entities.UserAccount userAccount = …
Run Code Online (Sandbox Code Playgroud) ef-core-2.2 ×10
c# ×7
asp.net-core ×1
azure ×1
ef-core-2.0 ×1
ef-core-2.1 ×1
ef-core-3.0 ×1
entity-framework-migrations ×1
geospatial ×1
spatial ×1
sql-server ×1
unit-testing ×1