PostgreSQL EF.Core DB-First 无效的数据库模型:无法为 属性 'Db.Order.High' 的 CLR 类型 'bool' 找到关系类型的映射
PostgreSQL EF.Core DB-First Invalid DB Model: No mapping to a relational type can be found for property 'Db.Order.High' with the CLR type 'bool'
我正在使用 Asp.net 核心 3 C# 和 Entity Framework 核心 3,我正在尝试使用 PostgreSQL 服务器。
这是我的模型,其中包含在异常中命名的 bool High:
public class Order : IEquatable<Order>, ICloneable
{
public long Id { get; set; }
public long? DeviceId { get; set; }
[Required]
[DataType(DataType.Text)]
public Device Device { get; set; }
public long? OriginOrderId { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime RoutineStart { get; set; }
[Required]
[EnumDataType(typeof(Routine))]
public Routine Routine { get; set; }
[Required]
[DataType(DataType.Text)]
public int Pin { get; set; }
[Required]
public bool High { get; set; }
[Required]
[DataType(DataType.Text)]
public int TimeInMilliseconds { get; set; }
public string Description { get; set; }
[NotMapped]
public bool Ready { get; set; }
public OrderState State { get; set; } = OrderState.Idle;
}
上下文是一个作用域服务,应该无关紧要,但是...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("postgre")), ServiceLifetime.Scoped);
我尝试使用 Add-Migration init 添加初始迁移,这就是整个异常:
add-migration init Microsoft.EntityFrameworkCore.Infrastructure[10403] Entity Framework Core 3.0.0 initialized 'ApplicationDbContext' using provider 'Npgsql.EntityFrameworkCore.PostgreSQL' with options: None
System.InvalidOperationException: No mapping to a relational type can be found for property 'Webservice.Models.Db.Order.High' with the CLR type 'bool'.
at Microsoft.EntityFrameworkCore.Storage.RelationalTypeMappingSourceExtensions.GetMapping(IRelationalTypeMappingSource typeMappingSource, IProperty property)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(IProperty source, IProperty target, DiffContext diffContext)+MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext()
at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(TableMapping source, TableMapping target, DiffContext diffContext)+MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext()
at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Sort(IEnumerable`1 operations, DiffContext diffContext)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetDifferences(IModel source, IModel target)
at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(String migrationName, String rootNamespace, String subNamespace, String language)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0(
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0(
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) No mapping to a relational type can be found for property 'Webservice.Models.Db.Order.High' with the CLR type 'bool'.
解决此问题的方法是从订单继承 "ViewOrder",而数据库中仅存储订单:
订单
public int high { get; set; }
查看订单:订单
public bool High
{
get => high == 1;
set => high = value ? 1 : 0;
}
但我宁愿不这样做。 T-SQL里面一定有bit这样的东西。
如果有人能向我解释如何在 PostgreSQL 模型中使用 bool,我将非常感激。
https://www.npgsql.org/doc/types/basic.html
看到这个,
PostgreSQL 类型需要使用 [boolean] 到默认 .NET 类型 [bool]
这个问题的解决方法是删除所有旧的迁移。它显示了有关 "bool" 的错误,但该错误与错误消息无关。
我不明白,但是删除所有迁移并初始化数据库新解决了它。
PostgreSQL 实际上托管了一个 _EFMigrations Table。错误从那里开始传播。我记得当我尝试使用 .NET Core 和 EFCore 从 SQLServer 迁移到 PostgreSQL 时遇到过一个这样的问题。
如果你想这样做
使用这个命令可以让你一个一个地回滚所有的迁移。
EntityframeworkCore\Update-Database 0
通过 运行
进行新的迁移
EntityFrameworkCore\Add-Migration Init
PostGreSQL 现在应该能够跟踪所有迁移和数据库状态。
正如@Michael Santos 建议的那样
问题:
对我来说实际上首先我使用 visual studio 的默认身份验证创建了项目,它为 sql 服务器数据库创建了一个迁移,而我需要将我的网络应用程序连接到 Postgresql。因此,当我 运行 Update-Database 我向我显示 "null reference" 的错误时,当我添加新的迁移时,它向我显示 "no mapping" 的错误,因为已经添加了默认迁移
解决方案:
删除旧迁移和 ApplicationDbContextModelSnapshot
创建新迁移 (Add-Migration migrationName )
更新数据库
我正在使用 Asp.net 核心 3 C# 和 Entity Framework 核心 3,我正在尝试使用 PostgreSQL 服务器。
这是我的模型,其中包含在异常中命名的 bool High:
public class Order : IEquatable<Order>, ICloneable
{
public long Id { get; set; }
public long? DeviceId { get; set; }
[Required]
[DataType(DataType.Text)]
public Device Device { get; set; }
public long? OriginOrderId { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime RoutineStart { get; set; }
[Required]
[EnumDataType(typeof(Routine))]
public Routine Routine { get; set; }
[Required]
[DataType(DataType.Text)]
public int Pin { get; set; }
[Required]
public bool High { get; set; }
[Required]
[DataType(DataType.Text)]
public int TimeInMilliseconds { get; set; }
public string Description { get; set; }
[NotMapped]
public bool Ready { get; set; }
public OrderState State { get; set; } = OrderState.Idle;
}
上下文是一个作用域服务,应该无关紧要,但是...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("postgre")), ServiceLifetime.Scoped);
我尝试使用 Add-Migration init 添加初始迁移,这就是整个异常:
add-migration init Microsoft.EntityFrameworkCore.Infrastructure[10403] Entity Framework Core 3.0.0 initialized 'ApplicationDbContext' using provider 'Npgsql.EntityFrameworkCore.PostgreSQL' with options: None
System.InvalidOperationException: No mapping to a relational type can be found for property 'Webservice.Models.Db.Order.High' with the CLR type 'bool'.
at Microsoft.EntityFrameworkCore.Storage.RelationalTypeMappingSourceExtensions.GetMapping(IRelationalTypeMappingSource typeMappingSource, IProperty property)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(IProperty source, IProperty target, DiffContext diffContext)+MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext()
at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(TableMapping source, TableMapping target, DiffContext diffContext)+MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext()
at System.Linq.Enumerable.ConcatIterator`1.MoveNext()
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Sort(IEnumerable`1 operations, DiffContext diffContext)
at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetDifferences(IModel source, IModel target)
at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(String migrationName, String rootNamespace, String subNamespace, String language)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0(
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0(
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) No mapping to a relational type can be found for property 'Webservice.Models.Db.Order.High' with the CLR type 'bool'.
解决此问题的方法是从订单继承 "ViewOrder",而数据库中仅存储订单:
订单
public int high { get; set; }
查看订单:订单
public bool High
{
get => high == 1;
set => high = value ? 1 : 0;
}
但我宁愿不这样做。 T-SQL里面一定有bit这样的东西。 如果有人能向我解释如何在 PostgreSQL 模型中使用 bool,我将非常感激。
https://www.npgsql.org/doc/types/basic.html
看到这个, PostgreSQL 类型需要使用 [boolean] 到默认 .NET 类型 [bool]
这个问题的解决方法是删除所有旧的迁移。它显示了有关 "bool" 的错误,但该错误与错误消息无关。 我不明白,但是删除所有迁移并初始化数据库新解决了它。
PostgreSQL 实际上托管了一个 _EFMigrations Table。错误从那里开始传播。我记得当我尝试使用 .NET Core 和 EFCore 从 SQLServer 迁移到 PostgreSQL 时遇到过一个这样的问题。 如果你想这样做
使用这个命令可以让你一个一个地回滚所有的迁移。
EntityframeworkCore\Update-Database 0
通过 运行
进行新的迁移EntityFrameworkCore\Add-Migration Init
PostGreSQL 现在应该能够跟踪所有迁移和数据库状态。
正如@Michael Santos 建议的那样 问题: 对我来说实际上首先我使用 visual studio 的默认身份验证创建了项目,它为 sql 服务器数据库创建了一个迁移,而我需要将我的网络应用程序连接到 Postgresql。因此,当我 运行 Update-Database 我向我显示 "null reference" 的错误时,当我添加新的迁移时,它向我显示 "no mapping" 的错误,因为已经添加了默认迁移 解决方案: 删除旧迁移和 ApplicationDbContextModelSnapshot 创建新迁移 (Add-Migration migrationName ) 更新数据库