.net core .Net Core 3.1.5类库,EF Core 3.1.5-“;数据类型';nvarchar';在本表格中不受支持”;

.net core .Net Core 3.1.5类库,EF Core 3.1.5-“;数据类型';nvarchar';在本表格中不受支持”;,.net-core,entity-framework-core,dbcontext,.net Core,Entity Framework Core,Dbcontext,我正在从事ASP.NET核心3.1 web应用程序和其他卫星项目。我在所有其他项目中使用了一些常用函数(如auth),因此我想在公共类库(.Net Core 3.1类库)中实现它们。 常用函数包括DB访问,因此我必须在类库中实现EF Core DBContext。 问题是库中没有Startup.cs,因此我需要手动实例化上下文,如下所示: var optionsBuilder = new DbContextOptionsBuilder<JWTAuthDataContext>(); o

我正在从事ASP.NET核心3.1 web应用程序和其他卫星项目。我在所有其他项目中使用了一些常用函数(如auth),因此我想在公共类库(.Net Core 3.1类库)中实现它们。 常用函数包括DB访问,因此我必须在类库中实现EF Core DBContext。 问题是库中没有Startup.cs,因此我需要手动实例化上下文,如下所示:

var optionsBuilder = new DbContextOptionsBuilder<JWTAuthDataContext>();
optionsBuilder.UseSqlServer(ConnectionString);
_context = new JWTAuthDataContext(optionsBuilder.Options);
[Table("JWTUSER")]
public class JWTUSER
{
    [Key]
    [Column("RECID", TypeName = "bigint")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long RECID { get; set; } // bigint, not null

    [Column("FIRSTNAME", TypeName = "nvarchar(100)")]
    public string FIRSTNAME { get; set; } // nvarchar(100), not null

    [Column("LASTNAME", TypeName = "nvarchar(100)")]
    public string LASTNAME { get; set; } // nvarchar(100), not null

    [Column("USERNAME", TypeName = "nvarchar(100)")]
    public string USERNAME { get; set; } // nvarchar(100), not null

    [Column("DATAAREAID", TypeName = "nvarchar(10)")]
    public string DATAAREAID { get; set; } // nvarchar(10), not null
}
我得到一个错误,说:

“此表单不支持数据类型'nvarchar'。请指定 类型名称中显式显示的长度,例如“nvarchar(16)”, 或者删除数据类型并使用诸如HasMaxLength之类的API来允许EF 选择数据类型。“

模型定义如下所示:

var optionsBuilder = new DbContextOptionsBuilder<JWTAuthDataContext>();
optionsBuilder.UseSqlServer(ConnectionString);
_context = new JWTAuthDataContext(optionsBuilder.Options);
[Table("JWTUSER")]
public class JWTUSER
{
    [Key]
    [Column("RECID", TypeName = "bigint")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long RECID { get; set; } // bigint, not null

    [Column("FIRSTNAME", TypeName = "nvarchar(100)")]
    public string FIRSTNAME { get; set; } // nvarchar(100), not null

    [Column("LASTNAME", TypeName = "nvarchar(100)")]
    public string LASTNAME { get; set; } // nvarchar(100), not null

    [Column("USERNAME", TypeName = "nvarchar(100)")]
    public string USERNAME { get; set; } // nvarchar(100), not null

    [Column("DATAAREAID", TypeName = "nvarchar(10)")]
    public string DATAAREAID { get; set; } // nvarchar(10), not null
}
我还尝试在OnModelCreating中添加fluent API(HasColumnType、HasMaxLength等),但没有成功

然后我将模型和DBContext从类库复制到web应用程序代码中,并在Startup.cs中使用DI,然后我的代码就可以正常工作了。我可以查询该表,并且没有错误消息

更新: 我已经在类库(Microsoft.Extensions.DependencyInjection)中实现了缺少的DI,并使用扩展方法扩展了IServiceCollection

public static IServiceCollection AddJWTAuthCore(this IServiceCollection services, JWTAuthCoreOptions options)
{
    services.AddDbContext<JWTAuthDataContext>(x => x.UseSqlServer(options.ConnectionString));
    services.AddScoped<AuthService>();
    return services;
}
这是运行没有错误,但仍然得到相同的错误时,我试图从库访问实体

当web应用程序运行良好时,是什么导致类库中出现问题


任何ide都将不胜感激。谢谢。

解决了:问题是nvarchar(max)列被注释为

[Column("COLUMN1", TypeName = "nvarchar")]
因为我在某个地方读到(不幸的是,我记不起在哪里,但它一定是一个过时的文档),如果没有指定,默认长度是MAX

当我在注释中包含(max)时,解决方案立即开始工作

[Column("COLUMN1", TypeName = "nvarchar(max)")]

很难相信-你有一个干净的最低限度的改造吗?您的上下文是否包含其他实体?请注意,异常并不意味着问题出现在显示的实体中,只是db模型是惰性构建的。如果您发出
\u=\u context.Model,您应该会得到相同的异常,不是吗?你也搜索过项目文件中的“nvarchar”?@IvanStoev,是的,有更多的实体,我发现更多的nvarchar字段注释不同。已修复它们,但仍会收到错误。我怀疑nvarchar(max)可能会引起一些麻烦。这些都是这样注释的:[Column(“TOKEN”,TypeName=“nvarchar”)]公共字符串标记{get;set;}//nvarchar(max),而不是null现在我将所有TypeName=“nvarchar”更改为TypeName=“nvarchar(max)”并且它正在工作。陛下它回答了为什么它在网站上工作的问题:JWTUser实体没有nvarchar(max)列,我只复制了那个实体。谢谢你支持我@IvanStoev.-你是对的,context.Model引发了异常。