.Net Core 3.1.5 Class Lib, EF Core 3.1.5 - "数据类型'nvarchar'不支持这种形式"

问题描述 投票:0回答:1

我正在做一个ASP.NET Core 3.1的网络应用,以及其他卫星项目。有一些共同的功能(如Auth)我在所有其他项目中使用,所以我想在共同的类库(.Net Core 3.1类库)中实现它们。常用函数包括DB访问,所以我必须在类库中实现EF Core DBContext。问题是库中没有Startup.cs,所以我需要手动实例化上下文,像这样。

var optionsBuilder = new DbContextOptionsBuilder<JWTAuthDataContext>();
optionsBuilder.UseSqlServer(ConnectionString);
_context = new JWTAuthDataContext(optionsBuilder.Options);

虽然这样做是可行的,但每当我试图访问一个实体时...

var users = _context.JWTUser.ToList();

我收到一个错误信息说

"此表格不支持数据类型'nvarchar'。要么在类型名中明确指定长度,例如作为'nvarchar(16)',要么删除数据类型,并使用HasMaxLength等API让EF选择数据类型。"

模型定义是这样的。

[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中添加流畅的API(HasColumnType,HasMaxLength等),没有成功。

然后我把类库中的模型和DBContext复制到Web应用代码中,并在Startup.cs中使用DI,然后我的代码就像预期的那样工作了。我可以查询表,而且没有错误信息。

更新。 我在我的类库中实现了缺失的DI(Microsoft.Extensions.DependencyInjection),并通过我的扩展方法扩展了IServiceCollection。

public static IServiceCollection AddJWTAuthCore(this IServiceCollection services, JWTAuthCoreOptions options)
{
    services.AddDbContext<JWTAuthDataContext>(x => x.UseSqlServer(options.ConnectionString));
    services.AddScoped<AuthService>();
    return services;
}

这可以从Web应用程序的Startup中调用,如

services.AddJWTAuthCore(new JWTAuthCoreOptions()
{
    ConnectionString = G.ConnectionString
});

这是无错误运行,但当我试图从库中访问实体时,仍然得到相同的错误。

是什么原因导致了类库中的问题,而web应用却运行良好?

任何想法都将被感激。谢谢你。

.net-core entity-framework-core dbcontext
1个回答
1
投票

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

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

因为我在某个地方读到(很遗憾我记不起是在哪里读到的,但一定是一个过时的文档),如果没有指定,默认长度是MAX。

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

[Column("COLUMN1", TypeName = "nvarchar(max)")]
© www.soinside.com 2019 - 2024. All rights reserved.