标签: ef-core-2.2

使用 EF.Functions.Contains() 的单元测试方法

我有一个方法,其中包含对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 数据库上获取相同的索引?

有什么办法可以解决这个异常吗?

c# unit-testing entity-framework ef-core-2.2

6
推荐指数
1
解决办法
1577
查看次数

Ef核心中的数学绝对值?

我正在尝试建立这样的查询

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)

c# entity-framework asp.net-core ef-core-2.2

6
推荐指数
1
解决办法
170
查看次数

EF核心修改实体状态如何表现?

在更改之后或更改之前,我们将实体状态置为=修改是否重要?

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)

c# entity-framework-core ef-core-2.2

5
推荐指数
1
解决办法
911
查看次数

在数据库中更新时未保存嵌套的拥有者类型

我有以下课程:

订购:

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)

c# ef-core-2.2

5
推荐指数
1
解决办法
571
查看次数

如果DbContext的OnConfiguring方法中的所有配置都如何使用AddDbContextPool

我正在使用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的其他配置。如何实现呢?

c# entity-framework entity-framework-core ef-core-2.2

5
推荐指数
1
解决办法
490
查看次数

实体框架核心 + 空间数据正在引发 SRID 无效错误

我收到以下错误:

错误: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

5
推荐指数
2
解决办法
1215
查看次数

如果我忽略用于某个过程的 dbset,我将无法使用 EF Core 来获取该过程

我有一个运行良好的 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 代码的能力似乎总是最大的缺点是自定义对象及其创建和检索。

c# entity-framework entity-framework-core ef-core-2.2

5
推荐指数
1
解决办法
1698
查看次数

如何在启用 EF Core 迁移的情况下在 Azure 中运行蓝绿部署

我想运行蓝绿部署;然而,EF 迁移似乎阻止了这一点。如果我将版本 1 部署到蓝色插槽,创建 EF 迁移并将版本 2 部署到绿色插槽,则会发生以下两种情况之一。

场景一:

我将运行迁移,版本 1 将停止工作。这违背了能够在绿色插槽中测试版本 2 同时让我们的用户在蓝色插槽中运行版本 1 的目的。

场景2:

在从蓝色插槽切换到绿色插槽之前,我不会运行迁移。这意味着在允许用户访问版本 2 之前我无法测试绿色插槽(版本 2)。

处理这个问题的标准/最佳实践是什么?

azure blue-green-deployment entity-framework-migrations ef-core-2.2

5
推荐指数
1
解决办法
707
查看次数

EF Core 3.0 .Include 无法按预期工作且速度超慢

我在 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)

c# ef-core-2.2 ef-core-3.0

5
推荐指数
2
解决办法
2603
查看次数

已创建二十多个“IServiceProvider”实例供实体框架内部使用

我在 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)

entity-framework-core ef-core-2.0 ef-core-2.1 ef-core-2.2

5
推荐指数
2
解决办法
6469
查看次数