我有一个通过Nuget提供给我的课程。我没有消息来源。
public class SpecialProductResult
{
public int id { get; set; }
public decimal SpecialPercent {get;set;}
}
我想从存储过程中填充SpecialProductResult的列表
所以在我的DbContext中,
public DbQuery<SpecialProductDto> SpecialProducts { get; set; }
我使用填充列表
var specialProducts = connect.SpecialProducts.FromSql("spGetSpecialProducts").ToList()
在错误日志中,我看到类似的消息
没有为实体的小数列“ SpecialPercent”指定类型 键入“ SpecialProductResult”。这将导致值无声 如果它们不符合默认精度和比例,则将截断。 明确指定可容纳所有内容的SQL Server列类型 值使用“ ForHasColumnType()”。
我看着this question,想尝试
modelBuilder.Entity<SpecialProductResult>().Property(o => o.GoldPercent).HasPrecision(18,4)
但是没有属性。具有精度
我应该尝试什么?
[更新]
我尝试了Ivan Stoev的答案,但是收到了运行时错误
The entity type 'SpecialProductResult' cannot be added to the model because a query type with the same name already exists
答案 0 :(得分:1)
当前,EF Core没有提供独立于数据库的方式来指定数字类型的精度和小数位数(类似于EF6 HasPrecision
)。
唯一的方法是使用HasColumnType并指定数据库特定的类型。如果需要支持其他数据库,则必须对每种数据库类型使用if
语句和不同的HasColumnType
。
对于SqlServer,应该是
modelBuilder.Query<SpecialProductResult>()
.Property(o => o.GoldPercent)
.HasColumnType("decimal(18,4)");
答案 1 :(得分:1)
public class Part
{
public Guid PartId { get; set; }
public string Number { get; set; }
[Column(TypeName = "decimal(18,4)")] // <--
public decimal Size { get; set; }
}
答案 2 :(得分:1)
从 EF Core 2.0 开始,就有了 IEntityTypeConfiguration。如果您正在使用该方法,则可以按如下方式解决:
class PartConfiguration : IEntityTypeConfiguration<Part>
{
public void Configure(EntityTypeBuilder<Part> builder){
builder.Property(c => c.PartId);
builder.Property(c => c.Number);
builder.Property(c => c.Size)
.HasPrecision(18, 4) <-- Use Either This
.HasColumnType("decimal(18,4)"); <-- Or this
}
}
...
// OnModelCreating
builder.ApplyConfiguration(new PartConfiguration());
有关使用模型构建器的更多信息,请参阅Microsoft Docs