标签: ef-core-2.0

如何在 ASP.NET Core 2.0 和 EF Core 2.0 中将应用程序设置从项目根获取到 IDesignTimeDbContextFactory 实现

我正在 ASP.NET Core 2.0 中构建应用程序,但在 EntityFramework 迁移方面遇到问题。

我的 DbContext 位于一个单独的项目 ( SolutionName \ ProjectNamePrefix .Data) 中,因此我创建了 IDesignTimeDbContextFactory 接口的实现。

我想为不同的环境使用不同的连接字符串,并且我需appsettings.json要这样做。

因此,经过快速搜索后,我发现我可以在函数IConfigurationRoot内创建一个新对象CreateDbContext,如下所示: https: //codingblast.com/entityframework-core-idesigntimedbcontextfactory/

dotnet ef migrations list -c MyContext我添加了它,然后为了测试,尝试从数据项目根文件夹运行。

然后我收到以下错误:

The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\dev\*SolutionName*\*ProjectNamePrefix*.Data\bin\Debug\netcoreapp2.0\appsettings.json'.
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我尝试了 3 个选项来获取正确的根路径:

  • Directory.GetCurrentDirectory();
  • env.ContentRootPath;IHostingEnvironment对象,我找到了一种方法来获取它: https: //github.com/aspnet/Home/issues/2194
  • AppDomain.CurrentDomain.BaseDirectory;

他们都返回同一..\bin\debug\netcoreapp2.0\条路。当我从 VS 运行数据项目时,前两个选项为我提供了正确的项目根文件夹。

有没有办法获取正确的项目内容根文件夹?

因为当我向 EF 命令添加 --verbose 时,它​​会注销一行:

Using content root 'C:\dev\FitsMeIdentity\FitsMeIdentity.Data\'.
Run Code Online (Sandbox Code Playgroud)

所以我知道 …

asp.net entity-framework entity-framework-core asp.net-core-2.0 ef-core-2.0

6
推荐指数
2
解决办法
4994
查看次数

EF Core-索引中的导航属性

我有以下两节课

public class Tip
{
    public string Home { get; set; }
    public string Away { get; set; }
    public string Prediction { get; set; }
    public Tipster Tipster { get; set; }
    ... other properties
}


public class Tipster
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Platform { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想在“提示”表中创建唯一索引。根据EF Core文档,没有Data Annotations语法,因此我使用的是流利的一种:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Tip>()
            .HasIndex(entity => new { entity.Tipster, entity.Home, entity.Away, …
Run Code Online (Sandbox Code Playgroud)

c# ef-core-2.0

6
推荐指数
2
解决办法
1214
查看次数

FirstOrDefaultAsync()和SingleOrDefaultAsync()与FindAsync()EFCore

我们有3种不同的方法来得到EFCore单品他们FirstOrDefaultAsync()SingleOrDefaultAsync()(包括其版本有没有默认值返回,我们也有FindAsync(),也许更喜欢用同样的目的LastOrDefaultAsync()

     var findItem = await dbContext.TodoItems
       .FindAsync(request.Id)
       .ConfigureAwait(false);

     var firstItem = await dbContext.TodoItems
        .FirstOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);

     var singleItem = await dbContext.TodoItems
        .SingleOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

我想知道它们之间的区别。到目前为止,我所知道的是我们FirstOrDefaultAsync()得到第一个给定的条件(通常使用此条件是因为我们知道一个以上的条件可以满足该条件),另一方面,我们使用的 SingleOrDefaultAsync()是因为我们知道只有一个可能的匹配条件查找,并FindAsync()获得具有其主键的项目。

我认为FirstOrDefaultAsync()SingleOrDefaultAsync()总是访问数据库(对此不确定),FindAsync()这就是Microsoft文档所说的:

异步查找具有给定主键值的实体。如果上下文中存在具有给定主键值的实体,则将立即返回该实体,而无需向商店提出请求。否则,将向商店请求具有给定主键值的实体,如果找到该实体,则将该实体附加到上下文并返回。如果在上下文或存储中未找到任何实体,则返回null。

所以我的问题是,如果我们的给定条件用于FirstOrDefault()SingleOrDefault()并且FindAsync()是主键,那么我们有什么实际区别吗?

我认为第一次使用它们总是会命中数据库,但是下次调用该怎么办?。大概EFCore可以使用相同的情况下获得的值FirstOrDefault(),并SingleOrDefault()因为它的FindAsync()也许?

c# linq ef-core-2.0

6
推荐指数
2
解决办法
1624
查看次数

从 C# 控制台应用程序执行 Nuget Package Manager Console 命令

我有一个控制台应用程序,可以根据 poco 实体自动生成存储库模式的 C# 类和接口,这些实体是使用 Visual Studio 中的 NuGet 包管理器控制台中的 Scaffold-DbContext 命令自动生成的。为了自动化生成 pocos 以及相关存储库和接口的整个过程,我希望能够直接从控制台应用程序调用 Scaffold-DbContext 命令。是否可以在本机 CLI 之外调用 NuGet 包管理器控制台命令?

c# entity-framework visual-studio ef-core-2.0

5
推荐指数
0
解决办法
1434
查看次数

How do I specify a schema for IdentityServer4 Entity Framework Core Migrations?

I am using IdentityServer4 2.0.2, and have followed the QuickStart tutorial to use Entity Framework Core. I am trying to change from the default schema (dbo) to a custom schema in SQL Server. The following code is working correctly, instructing the DbContexts to look for the tables in the "idsrv4" schema.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    var identityConnectionString = Configuration.GetConnectionString("Identity");
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddTestUsers(Config.GetUsers())
        .AddConfigurationStore(options =>
        {
            options.DefaultSchema = "idsrv4";
            options.ConfigureDbContext = builder => builder.UseSqlServer(identityConnectionString,
                sql …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core identityserver4 ef-core-2.0

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

使用 EF Core IdentityContext 和 DbContext 进行订单管理

我正在 ASP MVC Core 2 上创建一个电子商务网站。我继承了我的用户并继承了用于处理用户数据的IdentityUser上下文,并继承了用于处理产品和订单等的不同上下文。IdentityDbContextDbContext

现在,我想将订单或购物车链接到特定用户,但无法思考如何在订单表中引用用户,因为它们处于不同的上下文中。我还使用 EF 创建的默认 guid 作为两个表中的主键。

我应该放弃DbContext并只使用IdentityDbContext吗?这样做是否会导致身份中的异步方法和其他常见的非异步方法出现问题。

这是我的课程中的一些代码片段

using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace shophe1.Models
{
    public enum Gender { Male, Female, Other}
    public class User : IdentityUser
    {
        public string FullName { get; set; }
        public Gender Gender { get; set; }
        public string ReferralID { get; set; }
        public DateTime RegistrationDateTime { get; set; }

        public string ActivationDateTime { get; set; } …
Run Code Online (Sandbox Code Playgroud)

asp.net-identity asp.net-core ef-core-2.0

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

Entity Framework Core 2 HasDefaultValueSql() 不适用于 MySQL

所以,我有一个带有这样的道具的模型:

public DateTime Date { get; set; }
Run Code Online (Sandbox Code Playgroud)

我尝试为此字段设置默认值,如下所示:

modelBuilder.Entity<Record>().Property(r => r.Date).HasDefaultValueSql("NOW()");
Run Code Online (Sandbox Code Playgroud)

问题是未设置数据库列默认值。当我使用“NOW()”函数时,迁移有效,但正如我所说,数据库中未设置列默认值。当我尝试其他 MySql 日期时间函数时,我收到此错误:

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本对应的手册,了解在第 1 行 '' 附近使用的正确语法

我在这里缺少什么?

mysql entity-framework entity-framework-core ef-core-2.0 entity-framework-migrations

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

使用拥有自己数据库的微服务进行聚合、排序、过滤和分页

方法和要求: 我们有一个使用 Sql Server 数据库在 ASP.Net Core 中开发的微服务架构,其中每个微服务都有自己的 SQL 数据库,并且不允许我们进行跨微服务通信来聚合数据并将数据从微服务发送回 api 网关和进一步回到 UI(浏览器)。

我们的浏览器有一个数据网格,需要从不同的微服务聚合数据后显示数据,例如一个数据网格必须显示客户姓名、地址、预订参考号。电话号码、国家/地区名称、酒店名称、酒店地址、酒店费用和其他更多详细信息。

上面的数据网格中还有一个功能,可以根据其中的每一列对上面的网格数据进行排序;根据不同的列值过滤网格也是一个要求。此外,我们还需要在同一网格中进行分页,页面大小为 10 条记录。

目前,据我所知,数据聚合必须发生在 API 网关层,并且在其之上必须应用排序、过滤和分页功能。

我们使用 EF Core 2.0 作为数据 ORM,将数据发送回微服务并进一步响应。

问题1

哪一层(UI、API 网关、微服务)应该执行这种排序、过滤和分页功能,以便获得最佳性能和更好的用户体验?

问题2

是否有可能所有参数(例如排序顺序、排序列名称、页面大小、页码、筛选列名称、筛选列值)都应始终从 API 网关层发送到微服务 api,并成功实现所有功能而没有任何延迟以及读取操作的最佳性能?

问题3:

我们创建一个粗粒度的微服务来代替上述选项,对数据进行聚合、排序、过滤和分页,而不是 API 网关层进行聚合(目前 API 网关仅在其他微服务中进行聚合),这是一个好的模式吗? ?

pagination microservices asp.net-core-webapi api-gateway ef-core-2.0

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

EF Core 更改跟踪 - 原始值和更改值的问题

我使用 .net core 2.0 和 EF core 2.0 配置了 Net core API。它包含存储库模式架构。

现在,我尝试使用 EF 更改跟踪器为每个保存更改实现审核日志。

我的问题:每当我尝试添加编辑/修改端点的日志时,原始值和当前值保持不变,并且是新更新的值。所以这样我就无法跟踪修改或更改。

这是我的ApplicationContext文件,我在其中覆盖了保存调用。

 public class ApplicationContext : DbContext
{
    public ApplicationContext(DbContextOptions options) : base(options: options) { }

    public DbSet<Item> Item { get; set; }
    public DbSet<ChangeLog> ChangeLog { get; set; }        

    public override int SaveChanges()
    {
        var modifiedEntities = ChangeTracker.Entries();

        foreach (var change in modifiedEntities)
        {
            var entityType = change.Entity.GetType().Name;
            if (entityType == "LogItem")
                continue;

            if (change.State == EntityState.Modified)
            {
                foreach (var prop in …
Run Code Online (Sandbox Code Playgroud)

c# repository-pattern asp.net-core ef-core-2.0

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

已创建二十多个“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
查看次数